diff --git a/TwosideKeeper.jar b/TwosideKeeper.jar index 4f8086f..14ca7bb 100644 Binary files a/TwosideKeeper.jar and b/TwosideKeeper.jar differ diff --git a/src/plugin.yml b/src/plugin.yml index 5bfdf22..dceaf24 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: TwosideKeeper main: sig.plugin.TwosideKeeper.TwosideKeeper -version: 3.8.6d +version: 3.9.0 commands: money: description: Tells the player the amount of money they are holding. diff --git a/src/sig/plugin/TwosideKeeper/ActionBarBuffUpdater.java b/src/sig/plugin/TwosideKeeper/ActionBarBuffUpdater.java index 4db97a6..1cc1ca4 100644 --- a/src/sig/plugin/TwosideKeeper/ActionBarBuffUpdater.java +++ b/src/sig/plugin/TwosideKeeper/ActionBarBuffUpdater.java @@ -17,6 +17,7 @@ public class ActionBarBuffUpdater{ actionbardisplay.append(ParseEffect(p,pe)); } } + actionbardisplay.append(AddAdditionalEffects(p)); if (actionbardisplay.toString().contains(" ")) { return actionbardisplay.toString().substring(0, actionbardisplay.toString().lastIndexOf(" ")); } else { @@ -24,6 +25,29 @@ public class ActionBarBuffUpdater{ } } + private static String AddAdditionalEffects(LivingEntity p) { + StringBuilder effectString=new StringBuilder(""); + if (p instanceof Player) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure((Player)p); + if (pd.lifestealstacks>4) { + effectString.append(ChatColor.AQUA+"❣"); + effectString.append(AppendAmplifier(pd.lifestealstacks-1)); + effectString.append(" "); + } + if (pd.weaponcharges>4) { + effectString.append(ChatColor.DARK_AQUA+"☤"); + effectString.append(AppendAmplifier(pd.weaponcharges-1)); + effectString.append(" "); + } + if (pd.damagepool>4) { + effectString.append(ChatColor.DARK_PURPLE+"♥"); + effectString.append(AppendAmplifier((int)(pd.damagepool-1))); + effectString.append(" "); + } + } + return effectString.toString()+ChatColor.RESET; + } + private static String ParseEffect(LivingEntity p, PotionEffect pe) { StringBuilder effectString=new StringBuilder(""); PotionEffectType pet = pe.getType(); @@ -65,7 +89,7 @@ public class ActionBarBuffUpdater{ private static String AppendAmplifier(int amplifier) { StringBuilder amp = new StringBuilder(" "); - amp.append(ChatColor.GRAY+WorldShop.toRomanNumeral(amplifier+1)); + amp.append(ChatColor.GRAY+""+(amplifier+1)); return amp.toString(); } diff --git a/src/sig/plugin/TwosideKeeper/Boss/EliteZombie.java b/src/sig/plugin/TwosideKeeper/Boss/EliteZombie.java index c1530c8..8f66167 100644 --- a/src/sig/plugin/TwosideKeeper/Boss/EliteZombie.java +++ b/src/sig/plugin/TwosideKeeper/Boss/EliteZombie.java @@ -61,6 +61,7 @@ public class EliteZombie extends EliteMonster{ double storingenergy_hit=0; Location target_leap_loc = null; HashMap storedblocks = new HashMap(); + HashMap storedblockdata = new HashMap(); public EliteZombie(Monster m) { super(m); @@ -482,8 +483,24 @@ public class EliteZombie extends EliteMonster{ for (int x=-radius;x0) { + if (b.getRelative(0, 1, 0).getType()!=Material.AIR && !b.getRelative(0,1,0).isLiquid()) { + b = b.getRelative(0, 1, 0); //Try going up, not down. + } else { + b = b.getRelative(0, -1, 0); + } + if (Math.abs(b.getLocation().getBlockY()-origy)>4) { + break; + } + } + TwosideKeeper.log("Selected block "+b.toString(), 5); + if (!aPlugin.API.isExplosionProof(b) && b.getType()!=Material.STAINED_GLASS) { + Material type = b.getType(); + Byte data = b.getData(); + storedblocks.put(b, type); + storedblockdata.put(b, data); b.setType(Material.STAINED_GLASS); b.setData((byte)4); } @@ -500,11 +517,10 @@ public class EliteZombie extends EliteMonster{ private void restoreBlocks() { for (Block b : storedblocks.keySet()) { - if (b.getType()!=Material.AIR && aPlugin.API.isDestroyable(b) && GenericFunctions.isSoftBlock(b)) { - FallingBlock fb = (FallingBlock)b.getLocation().getWorld().spawnFallingBlock(b.getLocation(), storedblocks.get(b), b.getData()); + if (GenericFunctions.isSoftBlock(storedblocks.get(b))) { + FallingBlock fb = (FallingBlock)b.getLocation().getWorld().spawnFallingBlock(b.getLocation(), storedblocks.get(b), storedblockdata.get(b)); fb.setMetadata("FAKE", new FixedMetadataValue(TwosideKeeper.plugin,true)); fb.setVelocity(new Vector(0,Math.random()*1.7,0)); - //b.setType(storedblocks.get(b)); b.setType(Material.AIR); } else { b.setType(storedblocks.get(b)); diff --git a/src/sig/plugin/TwosideKeeper/CustomDamage.java b/src/sig/plugin/TwosideKeeper/CustomDamage.java index ac6410d..c4c91f2 100644 --- a/src/sig/plugin/TwosideKeeper/CustomDamage.java +++ b/src/sig/plugin/TwosideKeeper/CustomDamage.java @@ -14,6 +14,8 @@ import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Arrow; +import org.bukkit.entity.Blaze; +import org.bukkit.entity.CaveSpider; import org.bukkit.entity.Creeper; import org.bukkit.entity.Enderman; import org.bukkit.entity.Entity; @@ -24,18 +26,23 @@ import org.bukkit.entity.Monster; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.entity.Skeleton; +import org.bukkit.entity.Skeleton.SkeletonType; import org.bukkit.entity.Slime; import org.bukkit.entity.Snowball; +import org.bukkit.entity.SpectralArrow; import org.bukkit.entity.Spider; import org.bukkit.entity.TippedArrow; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import org.bukkit.potion.PotionType; import org.bukkit.util.Vector; +import sig.plugin.TwosideKeeper.Events.PlayerDodgeEvent; import sig.plugin.TwosideKeeper.HelperStructures.ArtifactAbility; import sig.plugin.TwosideKeeper.HelperStructures.BowMode; import sig.plugin.TwosideKeeper.HelperStructures.ItemSet; @@ -104,7 +111,7 @@ public class CustomDamage { PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); pd.lasthitproperties=NONE; } - if (!InvulnerableCheck(damager,target,flags)) { + if (!InvulnerableCheck(damager,target,reason,flags)) { double dmg = 0.0; if (isFlagSet(flags,TRUEDMG)) { if (reason!=null) { @@ -146,12 +153,12 @@ public class CustomDamage { if (weapon.getType()==Material.BOW) { if ((damager instanceof Projectile)) { TwosideKeeper.log("This is a projectile! Reason: "+reason+", Damager: "+damager.toString(), 2); + dmg += addToPlayerLogger(damager,target,"Custom Arrow",calculateCustomArrowDamageIncrease(weapon,damager,target)); dmg += addMultiplierToPlayerLogger(damager,target,"Ranger Mult",dmg * calculateRangerMultiplier(weapon,damager)); double headshotdmg = addMultiplierToPlayerLogger(damager,target,"Headshot Mult",dmg * calculateHeadshotMultiplier(weapon,damager,target)); if (headshotdmg!=0.0) {headshot=true;} dmg += headshotdmg; dmg += addMultiplierToPlayerLogger(damager,target,"Bow Drawback Mult",dmg * calculateBowDrawbackMultiplier(weapon,damager,target)); - dmg += addMultiplierToPlayerLogger(damager,target,"Custom Arrow Mult",dmg * calculateCustomArrowMultiplier(weapon,damager,target)); } } } else { @@ -186,6 +193,9 @@ public class CustomDamage { dmg += addToPlayerLogger(damager,target,"Execute",(((GenericFunctions.getAbilityValue(ArtifactAbility.EXECUTION, weapon)*5.0)*(1-(target.getHealth()/target.getMaxHealth()))))); if (shooter instanceof Player) { dmg += addToPlayerLogger(damager,target,"Execute Set Bonus",(((ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getEquipment(shooter),(Player)shooter, ItemSet.LORASAADI, 4, 4)*5.0)*(1-(target.getHealth()/target.getMaxHealth()))))); + if (PlayerMode.getPlayerMode((Player)shooter)==PlayerMode.BARBARIAN) { + dmg += addMultiplierToPlayerLogger(damager,target,"Barbarian Execute Mult",dmg * (1-(target.getHealth()/target.getMaxHealth()))); + } } dmg += addMultiplierToPlayerLogger(damager,target,"Striker Mult",dmg * calculateStrikerMultiplier(shooter,target)); double preemptivedmg = addMultiplierToPlayerLogger(damager,target,"Preemptive Strike Mult",dmg * calculatePreemptiveStrikeMultiplier(target,shooter)); @@ -198,14 +208,22 @@ public class CustomDamage { dmg += addMultiplierToPlayerLogger(damager,target,"STRENGTH Mult",dmg * calculateStrengthEffectMultiplier(shooter,target)); dmg += addMultiplierToPlayerLogger(damager,target,"WEAKNESS Mult",dmg * calculateWeaknessEffectMultiplier(shooter,target)); dmg += addMultiplierToPlayerLogger(damager,target,"POISON Mult",dmg * calculatePoisonEffectMultiplier(target)); - double critdmg = addMultiplierToPlayerLogger(damager,target,"Critical Strike Mult",dmg * calculateCriticalStrikeMultiplier(weapon,shooter,target,flags)); + double critdmg = addMultiplierToPlayerLogger(damager,target,"Critical Strike Mult",dmg * calculateCriticalStrikeMultiplier(weapon,shooter,target,reason,flags)); if (critdmg!=0.0) {crit=true; aPlugin.API.critEntity(target, 15);} dmg += critdmg; double armorpendmg = addToPlayerLogger(damager,target,"Armor Pen",calculateArmorPen(damager,dmg,weapon)); addToLoggerActual(damager,dmg); addToPlayerRawDamage(dmg,target); - if (!isFlagSet(flags, TRUEDMG)) {dmg = CalculateDamageReduction(dmg-armorpendmg,target,damager);} + if (!isFlagSet(flags, TRUEDMG)) { + if (target instanceof Player) { + if (PlayerMode.getPlayerMode((Player)target)!=PlayerMode.BARBARIAN) { + dmg = CalculateDamageReduction(dmg-armorpendmg,target,damager); + } + } else { + dmg = CalculateDamageReduction(dmg-armorpendmg,target,damager); + } + } TwosideKeeper.log("Damage: "+dmg+", Armor Pen Damage: "+armorpendmg, 3); setupDamagePropertiesForPlayer(damager,((crit)?IS_CRIT:0)|((headshot)?IS_HEADSHOT:0)|((preemptive)?IS_PREEMPTIVE:0)); dmg = hardCapDamage(dmg+armorpendmg); @@ -341,6 +359,12 @@ public class CustomDamage { } } } + if (getDamagerEntity(damager) instanceof CaveSpider) { + applyCaveSpiderPoison(damager, p); + } + if (getDamagerEntity(damager) instanceof Skeleton) { + applyWitherSkeletonWither(damager, p); + } if (getDamagerEntity(damager) instanceof LivingEntity) { LivingEntity m = getDamagerEntity(damager); LivingEntityStructure md = LivingEntityStructure.getLivingEntityStructure(m); @@ -348,7 +372,7 @@ public class CustomDamage { } increaseStrikerSpeed(p); healDefenderSaturation(p); - reduceDefenderKnockback(p); + reduceKnockback(p); reduceSwiftAegisBuff(p); if (damage=30 && (reason==null || !reason.equalsIgnoreCase("forceful strike")) && + weapon.equals(p.getEquipment().getItemInMainHand())) { + p.playSound(p.getLocation(), Sound.BLOCK_WOOD_BUTTON_CLICK_ON, 3.0f, 0.6f); + //Apply 10 strikes across the field. + dmg*=2; + GenericFunctions.addSuppressionTime(target, 20*3); + double xspd=p.getLocation().getDirection().getX(); + double zspd=p.getLocation().getDirection().getZ(); + Location attackloc = p.getLocation().clone(); + for (int i=0;i<10;i++) { + attackloc = attackloc.add(xspd,0,zspd); + p.playSound(p.getLocation(), Sound.ENTITY_ENDERDRAGON_FIREBALL_EXPLODE, 0.1f, 1.4f); + aPlugin.API.sendSoundlessExplosion(attackloc, 0.6f); + GenericFunctions.DealDamageToNearbyMobs(attackloc, dmg, 1, true, 0.6, p, weapon, false, "Forceful Strike"); + } + pd.weaponcharges-=30; + GenericFunctions.sendActionBarMessage(p, ""); + } + } + return dmg; + } + + private static void increaseBarbarianCharges(Player p) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + if (PlayerMode.getPlayerMode(p)==PlayerMode.BARBARIAN) { + IncreaseWeaponCharges(p,2); + } + } + + public static void IncreaseWeaponCharges(Player p, int amt) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + if (pd.rage_time<=TwosideKeeper.getServerTickTime()) { + pd.weaponcharges+=amt; + GenericFunctions.sendActionBarMessage(p, ""); + } + } + + public static void IncreaseLifestealStacks(Player p, int amt) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + pd.lifestealstacks=Math.min(100,pd.lifestealstacks+amt*((pd.rage_time>TwosideKeeper.getServerTickTime())?2:1)); + GenericFunctions.sendActionBarMessage(p, ""); + } + + private static double sendDamageToDamagePool(Player p, double damage, String reason) { + if (reason==null || !reason.equalsIgnoreCase("damage pool")) { + if (PlayerMode.getPlayerMode(p)==PlayerMode.BARBARIAN) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + if (pd.damagepool==0) { + pd.damagepooltime=TwosideKeeper.getServerTickTime(); + } + if (damage>getTransferDamage(p)) { + pd.damagepool+=damage-getTransferDamage(p); + return getTransferDamage(p); + } else { + pd.damagepool=0; + return damage; + } + } else { + if (damage>GetDamageReductionFromDawntrackerPieces(p)) { + return damage-GetDamageReductionFromDawntrackerPieces(p); + } else { + return 0; + } + } + } + return damage; + } + + private static void increaseBarbarianStacks(Player p, ItemStack weapon) { + if (PlayerMode.getPlayerMode(p)==PlayerMode.BARBARIAN) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + if (pd.rage_time>TwosideKeeper.getServerTickTime()) { + IncreaseLifestealStacks(p,2); + } else { + IncreaseLifestealStacks(p,1); + } + pd.lastattacked=TwosideKeeper.getServerTickTime(); + if (p.getEquipment().getItemInMainHand().equals(weapon)) { + IncreaseWeaponCharges(p,1); + } + } + } + + private static void removeExperienceFromAlustineSetBonus(Player p) { + if (ItemSet.HasSetBonusBasedOnSetBonusCount(GenericFunctions.getHotbarItems(p), p, ItemSet.ALUSTINE, 7)) { + aPlugin.API.setTotalExperience(p, aPlugin.API.getTotalExperience(p)-p.getLevel()); + } + } + + private static void causeSpetralGlowAndAggro(Entity damager, Player p, LivingEntity target) { + if (damager instanceof SpectralArrow) { + if (target instanceof Monster) { + provokeMonster((Monster)target,p,p.getEquipment().getItemInMainHand()); + setAggroGlowTickTime((Monster)target,100); + } else { + GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.GLOWING, 20*5, 0, target); + } + } + } + public static void appendDebuffsToName(LivingEntity target) { if (target instanceof LivingEntity) { if (target.getCustomName()==null) { @@ -623,8 +853,8 @@ public class CustomDamage { } } - private static void addHealthFromLifesteal(Player p, double damage, ItemStack weapon) { - double lifestealamt = damage*calculateLifeStealAmount(p,weapon); + private static void addHealthFromLifesteal(Player p, double damage, ItemStack weapon, String reason) { + double lifestealamt = damage*calculateLifeStealAmount(p,weapon,reason); if ((p.getMaxHealth()-p.getHealth())TwosideKeeper.getServerTickTime()) { + Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin, new Runnable() { + @Override + public void run() { + p.setVelocity(p.getVelocity().multiply(0)); + } + },1); + } else { + Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin, new Runnable() { + @Override + public void run() { + p.setVelocity(p.getVelocity().multiply(0.3)); + } + },1); + } + return; + } if (PlayerMode.isDefender(p) && p.isBlocking()) { Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin, new Runnable() { @Override @@ -847,7 +1096,7 @@ public class CustomDamage { } static public boolean InvulnerableCheck(Entity damager, LivingEntity target) { - return InvulnerableCheck(damager,target,NONE); + return InvulnerableCheck(damager,target,"",NONE); } /** @@ -856,12 +1105,32 @@ public class CustomDamage { * @param target * @return Returns true if the target cannot be hit. False otherwise. */ - static public boolean InvulnerableCheck(Entity damager, LivingEntity target, int flags) { + static public boolean InvulnerableCheck(Entity damager, LivingEntity target, String reason, int flags) { + target.setLastDamage(0); + target.setNoDamageTicks(0); + target.setMaximumNoDamageTicks(0); if (damager instanceof Player && target instanceof Player && !damager.getWorld().getPVP()) { return true; //Cancel all PvP related events. } - if (isFlagSet(flags,IGNORE_DAMAGE_TICK) || (GenericFunctions.enoughTicksHavePassed(target, damager) && canHitMobDueToWeakness(damager) && !GenericFunctions.isSuppressed(getDamagerEntity(damager)))) { + if (isFlagSet(flags,IGNORE_DAMAGE_TICK) || (GenericFunctions.enoughTicksHavePassed(target, damager) && canHitMobDueToWeakness(damager) && !GenericFunctions.isSuppressed(getDamagerEntity(damager)) && !target.isDead())) { TwosideKeeper.log("Enough ticks have passed.", 5); + + if (CanResistExplosionsWithExperienceSet(damager, target, reason)) { + aPlugin.API.setTotalExperience((Player)target, (int)Math.max(aPlugin.API.getTotalExperience((Player)target)-ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getHotbarItems(target), (Player)target, ItemSet.ALUSTINE, 2, 2),0)); + ((Player)target).playSound(((Player)target).getLocation(), Sound.ENTITY_PLAYER_ATTACK_SWEEP, 3.0f, 1.0f); + ((Player)target).playSound(((Player)target).getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1.0f, 0.5f); + GenericFunctions.updateNoDamageTickMap(target, damager); + return true; + } + if (CanResistDotsWithExperienceSet(damager, target, reason)) { + aPlugin.API.setTotalExperience((Player)target, (int)Math.max(aPlugin.API.getTotalExperience((Player)target)-ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getHotbarItems(target), (Player)target, ItemSet.ALUSTINE, 3, 3),0)); + ((Player)target).playSound(((Player)target).getLocation(), Sound.ENTITY_PLAYER_ATTACK_SWEEP, 3.0f, 1.0f); + ((Player)target).playSound(((Player)target).getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1.0f, 0.5f); + GenericFunctions.updateNoDamageTickMap(target, damager); + return true; + } + + if (isFlagSet(flags,IGNOREDODGE) || !PassesIframeCheck(target,damager)) { TwosideKeeper.log("Not in an iframe.", 5); if (isFlagSet(flags,IGNOREDODGE) || !PassesDodgeCheck(target,damager)) { @@ -871,17 +1140,38 @@ public class CustomDamage { } else { if (target instanceof Player) { Player p = (Player)target; + PlayerDodgeEvent ev = new PlayerDodgeEvent(p,damager,reason,flags); + Bukkit.getPluginManager().callEvent(ev); + if (ev.isCancelled()) { + return false; + } p.playSound(p.getLocation(), Sound.ENTITY_PLAYER_ATTACK_SWEEP, 3.0f, 1.0f); PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); pd.fulldodge=false; + calculateGracefulDodgeTicks(target); + GenericFunctions.updateNoDamageTickMap(target, damager); + } else { + calculateGracefulDodgeTicks(target); + GenericFunctions.updateNoDamageTickMap(target, damager); } - calculateGracefulDodgeTicks(target); - GenericFunctions.updateNoDamageTickMap(target, damager); } } } return true; } + + public static boolean CanResistExplosionsWithExperienceSet(Entity damager, LivingEntity target, String reason) { + return target instanceof Player && ItemSet.HasSetBonusBasedOnSetBonusCount(GenericFunctions.getHotbarItems(target), (Player)target, ItemSet.ALUSTINE, 2) && + ((reason!=null && (reason.equalsIgnoreCase("explosion") || reason.equalsIgnoreCase("entity_explosion"))) + || damager instanceof Creeper) && + aPlugin.API.getTotalExperience((Player)target)>=ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getHotbarItems(target), (Player)target, ItemSet.ALUSTINE, 2, 2); + } + + public static boolean CanResistDotsWithExperienceSet(Entity damager, LivingEntity target, String reason) { + return target instanceof Player && ItemSet.HasSetBonusBasedOnSetBonusCount(GenericFunctions.getHotbarItems(target), (Player)target, ItemSet.ALUSTINE, 3) && + ((reason!=null && (reason.equalsIgnoreCase("poison") || reason.equalsIgnoreCase("wither") || reason.equalsIgnoreCase("fire_tick") || reason.equalsIgnoreCase("lava") || reason.equalsIgnoreCase("fire")))) && + aPlugin.API.getTotalExperience((Player)target)>=ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getHotbarItems(target), (Player)target, ItemSet.ALUSTINE, 3, 3); + } private static boolean canHitMobDueToWeakness(Entity damager) { LivingEntity shooter = getDamagerEntity(damager); @@ -1444,9 +1734,11 @@ public class CustomDamage { if (damager instanceof Player) { Player p = (Player)damager; PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); - dmg += 93.182445*pd.velocity*GenericFunctions.getAbilityValue(ArtifactAbility.HIGHWINDER, weapon); - pd.lasthighwinderhit=TwosideKeeper.getServerTickTime(); - GenericFunctions.sendActionBarMessage(p, TwosideKeeper.drawVelocityBar(pd.velocity,pd.highwinderdmg),true); + if (ArtifactAbility.containsEnchantment(ArtifactAbility.HIGHWINDER, weapon)) { + dmg += 93.182445*pd.velocity*GenericFunctions.getAbilityValue(ArtifactAbility.HIGHWINDER, weapon); + pd.lasthighwinderhit=TwosideKeeper.getServerTickTime(); + GenericFunctions.sendActionBarMessage(p, TwosideKeeper.drawVelocityBar(pd.velocity,pd.highwinderdmg),true); + } } return dmg; } @@ -1470,10 +1762,11 @@ public class CustomDamage { if (shooter instanceof Player) { dmg += ItemSet.GetTotalBaseAmount(GenericFunctions.getEquipment(shooter),shooter,ItemSet.PANROS); dmg += ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getEquipment(shooter),(Player)shooter, ItemSet.PANROS, 2, 2); - dmg += ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getEquipment(shooter),(Player)shooter, ItemSet.DAWNTRACKER, 4, 4); + //dmg += ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getEquipment(shooter),(Player)shooter, ItemSet.DAWNTRACKER, 4, 4); dmg += ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getEquipment(shooter),(Player)shooter, ItemSet.LORASAADI, 2, 2); dmg += ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getEquipment(shooter),(Player)shooter, ItemSet.LORASAADI, 3, 3); dmg += ItemSet.GetTotalBaseAmount(GenericFunctions.getEquipment(shooter), (Player)shooter, ItemSet.LORASYS); + dmg += ItemSet.HasSetBonusBasedOnSetBonusCount(GenericFunctions.getHotbarItems(shooter), (Player)shooter, ItemSet.ALUSTINE, 7)?((Player)shooter).getLevel():0; /*dmg += ItemSet.TotalBaseAmountBasedOnSetBonusCount((Player)shooter, ItemSet.JAMDAK, 3, 3); dmg += ItemSet.TotalBaseAmountBasedOnSetBonusCount((Player)shooter, ItemSet.DARNYS, 3, 3); dmg += ItemSet.TotalBaseAmountBasedOnSetBonusCount((Player)shooter, ItemSet.ALIKAHN, 3, 3); @@ -1507,7 +1800,7 @@ public class CustomDamage { } Location monsterHead = m.getEyeLocation(); TwosideKeeper.log("Distance: "+(arrowLoc.distanceSquared(monsterHead)), 5); - + boolean isheadshot=false; double headshotvaly=0.22/TwosideKeeper.HEADSHOT_ACC; TwosideKeeper.log("In here.", 2); if (proj.getShooter() instanceof Player) { @@ -1566,28 +1859,28 @@ public class CustomDamage { } else { mult+=2.0; p.sendMessage(ChatColor.DARK_RED+"Headshot! x2 Damage"); - - if (PlayerMode.isRanger(p) && GenericFunctions.getBowMode(p.getEquipment().getItemInMainHand())==BowMode.DEBILITATION) { - if (m.hasPotionEffect(PotionEffectType.BLINDNESS)) { - //Add to the current stack of BLINDNESS. - for (PotionEffect pe : m.getActivePotionEffects()) { - if (pe.getType().equals(PotionEffectType.BLINDNESS)) { - int lv = pe.getAmplifier(); - TwosideKeeper.log("New BLINDNESS level: "+lv,5); - p.playSound(p.getLocation(), Sound.ENTITY_RABBIT_ATTACK, 0.1f, 0.1f+((lv+1)*0.5f)); - m.removePotionEffect(PotionEffectType.BLINDNESS); - m.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,400,lv+1)); - break; - } - } - } else { - m.removePotionEffect(PotionEffectType.BLINDNESS); - m.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,400,0)); - p.playSound(p.getLocation(), Sound.ENTITY_RABBIT_ATTACK, 0.1f, 0.1f); - } - } + isheadshot=true; } + } + if (PlayerMode.isRanger(p) && GenericFunctions.getBowMode(p.getEquipment().getItemInMainHand())==BowMode.DEBILITATION) { + if (m.hasPotionEffect(PotionEffectType.BLINDNESS) && isheadshot) { + //Add to the current stack of BLINDNESS. + for (PotionEffect pe : m.getActivePotionEffects()) { + if (pe.getType().equals(PotionEffectType.BLINDNESS)) { + int lv = pe.getAmplifier(); + TwosideKeeper.log("New BLINDNESS level: "+lv,5); + p.playSound(p.getLocation(), Sound.ENTITY_RABBIT_ATTACK, 0.1f, 0.1f+((lv+1)*0.5f)); + m.removePotionEffect(PotionEffectType.BLINDNESS); + m.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,400,lv+1),true); + break; + } + } + } else { + m.removePotionEffect(PotionEffectType.BLINDNESS); + m.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,400,0)); + p.playSound(p.getLocation(), Sound.ENTITY_RABBIT_ATTACK, 0.1f, 0.1f); + } } } } @@ -1626,10 +1919,10 @@ public class CustomDamage { } private static double calculateCriticalStrikeMultiplier(ItemStack weapon, LivingEntity shooter, - LivingEntity target, int flags) { + LivingEntity target, String reason, int flags) { boolean criticalstrike=false; double critchance = 0.0; - critchance += calculateCriticalStrikeChance(weapon, shooter); + critchance += calculateCriticalStrikeChance(weapon, shooter, reason); TwosideKeeper.log("Crit Strike chance is "+critchance,4); criticalstrike = isCriticalStrike(critchance); if (isFlagSet(flags,CRITICALSTRIKE)) { @@ -1641,8 +1934,12 @@ public class CustomDamage { } return criticalstrike?(calculateCriticalStrikeMultiplier(shooter,weapon)):0.0; } - + static double calculateCriticalStrikeChance(ItemStack weapon, Entity damager) { + return calculateCriticalStrikeChance(weapon,damager,null); + } + + static double calculateCriticalStrikeChance(ItemStack weapon, Entity damager, String reason) { double critchance = 0.0; critchance += 0.01*GenericFunctions.getAbilityValue(ArtifactAbility.CRITICAL,weapon); LivingEntity shooter = getDamagerEntity(damager); @@ -1653,8 +1950,12 @@ public class CustomDamage { critchance += (PlayerMode.isStriker(p)?0.2:0.0); critchance += ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getEquipment(p), p,ItemSet.PANROS,4,4)/100d; critchance += (PlayerMode.isRanger(p)?(GenericFunctions.getPotionEffectLevel(PotionEffectType.SLOW, p)+1)*0.1:0.0); - critchance += ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getHotbarItems(p), p, ItemSet.MOONSHADOW, 5, 4)/100; + critchance += ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getHotbarItems(p), p, ItemSet.MOONSHADOW, 5, 4)/100d; + critchance += ItemSet.GetTotalBaseAmount(GenericFunctions.getHotbarItems(p), p, ItemSet.WOLFSBANE)/100d; critchance += (pd.slayermegahit)?1.0:0.0; + if (reason!=null && reason.equalsIgnoreCase("power swing")) { + critchance += 1.0d; + } } } return critchance; @@ -1744,7 +2045,11 @@ public class CustomDamage { target.setHealth(0.00001); target.damage(Integer.MAX_VALUE); } else { - target.setHealth(target.getHealth()-damage); + if (target.getHealth()-damage>target.getMaxHealth()) { + target.setHealth(target.getMaxHealth()); + } else { + target.setHealth(target.getHealth()-damage); + } } } } @@ -1979,11 +2284,26 @@ public class CustomDamage { GenericFunctions.addStackingPotionEffect(p, PotionEffectType.SPEED, 20*5, 4); } } + + public static double calculateLifeStealAmount(Player p, ItemStack weapon) { + return calculateLifeStealAmount(p,weapon,null); + } /*0.0-1.0*/ - public static double calculateLifeStealAmount(Player p, ItemStack weapon) { + public static double calculateLifeStealAmount(Player p, ItemStack weapon, String reason) { double lifestealpct = GenericFunctions.getAbilityValue(ArtifactAbility.LIFESTEAL, weapon)/100; + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); lifestealpct += ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getEquipment(p), p, ItemSet.DAWNTRACKER, 3, 3)/100d; + lifestealpct += pd.lifestealstacks/100d; + if (reason!=null && reason.equalsIgnoreCase("power swing")) { + lifestealpct += 1.0d; + } + if (pd.rage_time>TwosideKeeper.getServerTickTime()) { + lifestealpct += (pd.rage_amt/2)*0.01; + } + if (reason!=null && reason.equalsIgnoreCase("sweep up")) { + lifestealpct*=2; + } return lifestealpct; } @@ -2164,18 +2484,21 @@ public class CustomDamage { } } - private static double calculateCustomArrowMultiplier(ItemStack weapon, Entity damager, LivingEntity target) { - double mult = 0.0; - if (damager instanceof TippedArrow) { - TippedArrow a = (TippedArrow)damager; + private static double calculateCustomArrowDamageIncrease(ItemStack weapon, Entity damager, LivingEntity target) { + double dmg = 0.0; + if (damager instanceof Arrow) { + Arrow a = (Arrow)damager; if (a.hasMetadata("QUADRUPLE_DAMAGE_ARR")) { - mult += 3.0; + dmg += 15.0; } if (a.hasMetadata("DOUBLE_DAMAGE_ARR")) { - mult += 1.0; + dmg += 5.0; + } + if (a.hasMetadata("PIERCING_ARR")) { + dmg += 5.0; } } - return mult; + return dmg; } private static double calculateIsolationMultiplier(LivingEntity shooter, LivingEntity target) { @@ -2204,4 +2527,13 @@ public class CustomDamage { GenericFunctions.addSuppressionTime(target, (int)(GenericFunctions.getAbilityValue(ArtifactAbility.SUPPRESS, weapon)*20)); } } + + public static double getTransferDamage(Player p) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + return 15-GetDamageReductionFromDawntrackerPieces(p); + } + + public static int GetDamageReductionFromDawntrackerPieces(Player p) { + return ItemSet.GetTotalBaseAmount(GenericFunctions.getEquipment(p), p, ItemSet.DAWNTRACKER)/2; + } } diff --git a/src/sig/plugin/TwosideKeeper/Drops/SigDrop.java b/src/sig/plugin/TwosideKeeper/Drops/SigDrop.java index e95f92f..caaf020 100644 --- a/src/sig/plugin/TwosideKeeper/Drops/SigDrop.java +++ b/src/sig/plugin/TwosideKeeper/Drops/SigDrop.java @@ -122,11 +122,11 @@ public class SigDrop extends Drop{ switch (isWeapon) { case ARMOR: { item = new ItemStack(Material.valueOf(armorprefix+"_"+armorsuffix)); - item = CreateModifiedLootPiece(p, item); + item = CreateModifiedLootPiece(p, item, diff); }break; case WEAPON: { item = new ItemStack(Material.valueOf(toolprefix+"_SWORD")); - item = CreateModifiedLootPiece(p, item); + item = CreateModifiedLootPiece(p, item, diff); }break; case TOOL: { item = new ItemStack(Material.valueOf(toolprefix+"_"+toolsuffix)); @@ -140,9 +140,9 @@ public class SigDrop extends Drop{ return item; } - public ItemStack CreateModifiedLootPiece(Player p, ItemStack item) { + public ItemStack CreateModifiedLootPiece(Player p, ItemStack item, MonsterDifficulty md) { if (isSet) { - ItemSet set = MonsterDifficulty.PickAnItemSet(PlayerMode.getPlayerMode(p)); //This is the set we have to generate. + ItemSet set = MonsterDifficulty.PickAnItemSet(PlayerMode.getPlayerMode(p),md); //This is the set we have to generate. //Turn it into the appropriate piece if necessary. item = MonsterDifficulty.ConvertSetPieceIfNecessary(item, set); diff --git a/src/sig/plugin/TwosideKeeper/Events/PlayerDodgeEvent.java b/src/sig/plugin/TwosideKeeper/Events/PlayerDodgeEvent.java new file mode 100644 index 0000000..3b8ea31 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/Events/PlayerDodgeEvent.java @@ -0,0 +1,60 @@ +package sig.plugin.TwosideKeeper.Events; + +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; + +public class PlayerDodgeEvent extends Event implements Cancellable{ + private Player p; + private Entity damager; + private String reason; + private int flags; + private boolean cancelled; + private static final HandlerList handlers = new HandlerList(); + + public PlayerDodgeEvent(Player p, Entity damager, String reason, int flags) { + this.p=p; + this.damager=damager; + this.reason=reason; + this.flags=flags; + } + + public Player getPlayer() { + return p; + } + + public Entity getDamager() { + return damager; + } + + public String getReason() { + return reason; + } + + public int getFlags() { + return flags; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled=cancelled; + } + +} diff --git a/src/sig/plugin/TwosideKeeper/Events/PlayerLineDriveEvent.java b/src/sig/plugin/TwosideKeeper/Events/PlayerLineDriveEvent.java new file mode 100644 index 0000000..c6e688b --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/Events/PlayerLineDriveEvent.java @@ -0,0 +1,40 @@ +package sig.plugin.TwosideKeeper.Events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public final class PlayerLineDriveEvent extends Event implements Cancellable{ + private Player p; + private boolean cancelled; + private static final HandlerList handlers = new HandlerList(); + + public PlayerLineDriveEvent(Player p) { + this.p=p; + } + + public Player getPlayer() { + return p; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled=cancelled; + } + +} diff --git a/src/sig/plugin/TwosideKeeper/Events/PlayerTumbleEvent.java b/src/sig/plugin/TwosideKeeper/Events/PlayerTumbleEvent.java new file mode 100644 index 0000000..71fb171 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/Events/PlayerTumbleEvent.java @@ -0,0 +1,40 @@ +package sig.plugin.TwosideKeeper.Events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class PlayerTumbleEvent extends Event implements Cancellable{ + private Player p; + private boolean cancelled; + private static final HandlerList handlers = new HandlerList(); + + public PlayerTumbleEvent(Player p) { + this.p=p; + } + + public Player getPlayer() { + return p; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled=cancelled; + } + +} diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/ArrowBarrage.java b/src/sig/plugin/TwosideKeeper/HelperStructures/ArrowBarrage.java new file mode 100644 index 0000000..0c8e34e --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/ArrowBarrage.java @@ -0,0 +1,35 @@ +package sig.plugin.TwosideKeeper.HelperStructures; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffectType; + +import sig.plugin.TwosideKeeper.TwosideKeeper; +import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions; + +public class ArrowBarrage implements Runnable{ + int shots_left=20; + Player p; + int tick_spd = 3; + + public ArrowBarrage(int shots, Player p, int spd) { + this.shots_left=shots; + this.p = p; + this.tick_spd=spd; + } + + @Override + public void run() { + shots_left--; + Arrow arr = p.launchProjectile(Arrow.class); + arr.setVelocity(p.getLocation().getDirection().multiply(2)); + TwosideKeeper.ShootPiercingArrow(arr, p); + arr.remove(); + GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.SLOW, 4, 9, p, true); + if (shots_left>0) { + Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin, this, 3); + } + } + +} diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/Common/ArrowQuiver.java b/src/sig/plugin/TwosideKeeper/HelperStructures/Common/ArrowQuiver.java new file mode 100644 index 0000000..0687ab6 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/Common/ArrowQuiver.java @@ -0,0 +1,307 @@ +package sig.plugin.TwosideKeeper.HelperStructures.Common; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.metadata.MetadataValue; + +import sig.plugin.TwosideKeeper.TwosideKeeper; + +public class ArrowQuiver { + public final static String ARROW_QUIVER_IDENTIFIER = ChatColor.AQUA+"Arrow Quiver"; + public final static String ID_PREFIX = ChatColor.DARK_AQUA+""+ChatColor.BOLD+"ID "; + public final static String FIRINGMODE_IDENTIFIER = ChatColor.BLACK+""+ChatColor.MAGIC+"MODE "; + + public static boolean isValidQuiver(ItemStack item) { + return (item!=null && item.getType()==Material.TIPPED_ARROW && + item.hasItemMeta() && item.getItemMeta().hasLore() && + item.getItemMeta().getLore().contains(ARROW_QUIVER_IDENTIFIER)); + } + + public static int getID(ItemStack quiver) { + //Try to find the ID line. + List lore = quiver.getItemMeta().getLore(); + for (int i=0;i lore = quiver.getItemMeta().getLore(); + for (int i=0;i getContents(int id) { + File arrowquiver_dir = new File(TwosideKeeper.filesave+"/arrowquivers/"); + if (!arrowquiver_dir.exists()) { + arrowquiver_dir.mkdir(); + } + File config; + config = new File(TwosideKeeper.filesave,"/arrowquivers/"+id+".data"); + if (!config.exists()) { + try { + config.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + List inv = new ArrayList(); + + FileConfiguration workable = YamlConfiguration.loadConfiguration(config); + for (String key : workable.getKeys(false)) { + inv.add(workable.getItemStack(key)); + } + return inv; + } + + public static void addContents(ItemStack quiver, ItemStack...item) { + addContents(getID(quiver),item); + } + + public static void addContents(int id, ItemStack...item) { + List currentinv = getContents(id); + for (ItemStack it : item) { + if (it!=null) { + addItemToQuiver(currentinv, it); + } + } + saveInventory(id, currentinv); + } + + public static void removeContents(ItemStack quiver, ItemStack...item) { + removeContents(getID(quiver),item); + } + + public static void removeContents(int id, ItemStack...item) { + List currentinv = getContents(id); + for (ItemStack it : item) { + if (it!=null) { + removeItemFromQuiver(currentinv, it); + } + } + saveInventory(id, currentinv); + } + + private static void saveInventory(int id, List currentinv) { + File arrowquiver_dir = new File(TwosideKeeper.filesave+"/arrowquivers/"); + if (!arrowquiver_dir.exists()) { + arrowquiver_dir.mkdir(); + } + File config; + config = new File(TwosideKeeper.filesave,"/arrowquivers/"+id+".data"); + if (config.exists()) { + config.delete(); + try { + config.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + FileConfiguration workable = YamlConfiguration.loadConfiguration(config); + for (ItemStack item : currentinv) { + workable.set(item.getType().name()+"_"+item.hashCode(), item); + } + + try { + workable.save(config); + } catch (IOException e) { + e.printStackTrace(); + } + //updateQuiverLore(id, currentinv); + } + + private static List getBaseQuiverLore(int id, int mode) { + List baselore = new ArrayList(); + baselore.add(ARROW_QUIVER_IDENTIFIER); + baselore.add(FIRINGMODE_IDENTIFIER+mode); + baselore.add(ID_PREFIX+id); + return baselore; + } + + public static void updateQuiverLore(ItemStack quiver) { + ItemMeta m = quiver.getItemMeta(); + List contents = getContents(getID(quiver)); + List lore = getBaseQuiverLore(getID(quiver), getArrowQuiverMode(quiver)); + if (contents.size()>0) { + lore.add(""); + lore.add(ChatColor.WHITE+"Contains:"); + for (ItemStack item : contents) { + lore.add(ChatColor.GRAY+""+ChatColor.ITALIC+" - "+GenericFunctions.UserFriendlyMaterialName(item)+" x"+item.getAmount()); + } + } else { + lore.add(ChatColor.WHITE+"This quiver is empty!"); + lore.add(ChatColor.AQUA+"Click arrows into the quiver or"); + lore.add(ChatColor.AQUA+"pick up arrows off the ground"); + lore.add(ChatColor.AQUA+"to load them up!"); + } + m.setLore(lore); + m.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS); + m.addItemFlags(ItemFlag.HIDE_ENCHANTS); + quiver.setItemMeta(m); + quiver.addUnsafeEnchantment(Enchantment.ARROW_INFINITE, 5); + } + + private static void removeItemFromQuiver(List currentitems, ItemStack it) { + //First compare all items that exist. + int slot = getItemSlot(currentitems, it); + if (slot!=-1) { //Remove from the previous amount in the list. + if (currentitems.get(slot).getAmount()-it.getAmount()<1) { //Delete it if we run out of these arrows. + currentitems.remove(slot); + } else { + currentitems.get(slot).setAmount(currentitems.get(slot).getAmount()-it.getAmount()); + } + } + } + + private static void addItemToQuiver(List currentitems, ItemStack it) { + //First compare all items that exist. + int slot = getItemSlot(currentitems, it); + if (slot==-1) { //No similar item found, add a new entry. + TwosideKeeper.log("No slot found. Adding this way.", 5); + currentitems.add(it); + } else { //Add to the previous amount in the list. + currentitems.get(slot).setAmount(currentitems.get(slot).getAmount()+it.getAmount()); + } + } + + private static int getItemSlot(List currentitems, ItemStack it) { + for (int i=0;i getContentsAPI(ItemStack i) { + return getContents(getID(i)); + } + + public static int getArrowQuiverMode(ItemStack item) { + //Arrow quiver mode will be determined by an integer dictating which item slot we are on. + //If the slot is non-existent or out-of-bounds, we set it to 0 to indicate the first slot. + List lore = item.getItemMeta().getLore(); + List contents = getContents(getID(item)); + for (String text : lore) { + if (text.contains(FIRINGMODE_IDENTIFIER)) { + int mode = Integer.parseInt(text.replace(FIRINGMODE_IDENTIFIER, "")); + if (mode>=0 && contents.size()-1>=mode) { + return setArrowQuiverMode(item,mode); + } else { + return setArrowQuiverMode(item,0); + } + } + } + return setArrowQuiverMode(item,0); + } + + public static int setArrowQuiverMode(ItemStack item, int mode) { + ItemMeta m = item.getItemMeta(); + List lore = m.getLore(); + List contents = getContents(getID(item)); + int arrow_quiver_identifier_line = 0; + for (int i=0;i=mode) { + lore.set(i,FIRINGMODE_IDENTIFIER+mode); + } else { + lore.set(i,FIRINGMODE_IDENTIFIER+0); + } + m.setLore(lore); + item.setItemMeta(m); + return mode; + } + if (lore.get(i).contains(ARROW_QUIVER_IDENTIFIER)) { + arrow_quiver_identifier_line = i; + } + } + //Firing mode does not exist in the lore yet. Add it under the arrow quiver line. + TwosideKeeper.log("Adding a line @ "+arrow_quiver_identifier_line, 5); + lore.add(arrow_quiver_identifier_line+1,FIRINGMODE_IDENTIFIER+mode); + m.setLore(lore); + item.setItemMeta(m); + return mode; + } + + public static boolean isQuiverEmpty(ItemStack quiver) { + return getContents(getID(quiver)).size()==0; + } + + public static ItemStack ReturnAndRemoveShotArrow(ItemStack quiver) { + return ReturnAndRemoveShotArrow(quiver,null); + } + + /** + * Returns the first arrow quiver in the player's inventory following the same + * arrow check rules as Minecraft does. Off-hand slot, then hotbar, then inventory. + * + * Returns null if it cannot find an arrow quiver at all. + */ + public static ItemStack getArrowQuiverInPlayerInventory(Player p) { + ItemStack offhandslot = p.getInventory().getExtraContents()[0]; + ItemStack[] storagecontents = p.getInventory().getStorageContents(); + if (offhandslot!=null && ArrowQuiver.isValidQuiver(offhandslot)) { + return offhandslot; + } else { + for (int i=0;i contents = getContents(getID(quiver)); + if (contents.size()>0) { + ItemStack arrow = contents.get(getArrowQuiverMode(quiver)).clone(); + arrow.setAmount(1); + if (bow==null) { + ArrowQuiver.removeContents(getID(quiver), arrow); + } + return arrow; + } else { + return null; + } + } +} diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java b/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java index 4f5ff8f..49e2fb8 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java @@ -45,8 +45,10 @@ import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; +import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import org.bukkit.potion.PotionType; import org.bukkit.util.Vector; import org.inventivetalent.glow.GlowAPI; import org.inventivetalent.glow.GlowAPI.Color; @@ -63,12 +65,17 @@ import sig.plugin.TwosideKeeper.EliteMonster; import sig.plugin.TwosideKeeper.MonsterController; import sig.plugin.TwosideKeeper.LivingEntityStructure; import sig.plugin.TwosideKeeper.PlayerStructure; +import sig.plugin.TwosideKeeper.Recipes; import sig.plugin.TwosideKeeper.TwosideKeeper; import sig.plugin.TwosideKeeper.TwosideKeeperAPI; import sig.plugin.TwosideKeeper.Boss.EliteZombie; import sig.plugin.TwosideKeeper.Boss.MegaWither; +import sig.plugin.TwosideKeeper.Events.PlayerLineDriveEvent; +import sig.plugin.TwosideKeeper.Events.PlayerTumbleEvent; +import sig.plugin.TwosideKeeper.HelperStructures.ArrowBarrage; import sig.plugin.TwosideKeeper.HelperStructures.ArtifactAbility; import sig.plugin.TwosideKeeper.HelperStructures.BowMode; +import sig.plugin.TwosideKeeper.HelperStructures.CustomItem; import sig.plugin.TwosideKeeper.HelperStructures.EliteMonsterLocationFinder; import sig.plugin.TwosideKeeper.HelperStructures.ItemSet; import sig.plugin.TwosideKeeper.HelperStructures.PlayerMode; @@ -577,7 +584,7 @@ public class GenericFunctions { return "Iron Shovel"; } case GOLD_SPADE:{ - return "Gold Shovel"; + return "Golden Shovel"; } case DIAMOND_SPADE:{ return "Diamond Shovel"; @@ -1801,6 +1808,27 @@ public class GenericFunctions { } } } + case GOLD_HELMET:{ + return "Golden Helmet"; + } + case GOLD_LEGGINGS:{ + return "Golden Leggings"; + } + case GOLD_CHESTPLATE:{ + return "Golden Chestplate"; + } + case GOLD_BOOTS:{ + return "Golden Boots"; + } + case GOLD_AXE:{ + return "Golden Axe"; + } + case GOLD_PICKAXE:{ + return "Golden Pickaxe"; + } + case GOLD_HOE:{ + return "Golden Hoe"; + } default:{ return GenericFunctions.CapitalizeFirstLetters(type.getType().toString().replace("_", " ")); } @@ -2454,7 +2482,7 @@ public class GenericFunctions { } p.sendMessage(ChatColor.DARK_AQUA+"A level of "+ChatColor.YELLOW+"Mending"+ChatColor.DARK_AQUA+" has been knocked off of your "+((item.hasItemMeta() && item.getItemMeta().hasDisplayName())?item.getItemMeta().getDisplayName():UserFriendlyMaterialName(item))); } - if (infinitylv>0 && Math.random()<=0.00048828125*(isHarvestingTool(item)?0.75:1d)) { + if (infinitylv>0 && Math.random()<=0.005*(isHarvestingTool(item)?0.75:1d)) { infinitylv--; if (infinitylv>0) { item.addUnsafeEnchantment(Enchantment.ARROW_INFINITE, infinitylv); @@ -2724,26 +2752,29 @@ public class GenericFunctions { (GenericFunctions.getBowMode(p.getEquipment().getItemInMainHand())==BowMode.CLOSE)) { PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); if (pd.last_dodge+GetModifiedCooldown(TwosideKeeper.DODGE_COOLDOWN,p)<=TwosideKeeper.getServerTickTime()) { - pd.last_dodge=TwosideKeeper.getServerTickTime(); - aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), 100); - p.playSound(p.getLocation(), Sound.ENTITY_DONKEY_CHEST, 1.0f, 1.0f); - - int dodgeduration = 20; - - if (GenericFunctions.HasFullRangerSet(p)) { - dodgeduration=60; - } - - if (p.isSneaking()) { //Do a backwards dodge + jump. - p.setVelocity(p.getLocation().getDirection().multiply(-0.7f)); - } else { - p.setVelocity(p.getLocation().getDirection().multiply(1.4f)); + PlayerTumbleEvent ev = new PlayerTumbleEvent(p); + Bukkit.getPluginManager().callEvent(ev); + if (!ev.isCancelled()) { + pd.last_dodge=TwosideKeeper.getServerTickTime(); + aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), 100); + p.playSound(p.getLocation(), Sound.ENTITY_DONKEY_CHEST, 1.0f, 1.0f); + + int dodgeduration = 20; + + if (GenericFunctions.HasFullRangerSet(p)) { + dodgeduration=60; + } + + if (p.isSneaking()) { //Do a backwards dodge + jump. + p.setVelocity(p.getLocation().getDirection().multiply(-0.7f)); + } else { + p.setVelocity(p.getLocation().getDirection().multiply(1.4f)); + } + ApplySwiftAegis(p); + CustomDamage.addIframe(dodgeduration, p); + + logAndApplyPotionEffectToEntity(PotionEffectType.SPEED,dodgeduration,2,p); } - ApplySwiftAegis(p); - CustomDamage.addIframe(dodgeduration, p); - - - logAndApplyPotionEffectToEntity(PotionEffectType.SPEED,dodgeduration,2,p); } } } @@ -2758,7 +2789,7 @@ public class GenericFunctions { } public static void logAndApplyPotionEffectToEntity(PotionEffectType type, int ticks, int amplifier, LivingEntity p, boolean force) { - TwosideKeeper.log(ChatColor.WHITE+"Adding Potion Effect "+type.getName()+" "+WorldShop.toRomanNumeral((amplifier+1))+"("+amplifier+") to "+p.getName()+" with "+ticks+" tick duration. "+((force)?ChatColor.RED+"FORCED":""), TwosideKeeper.POTION_DEBUG_LEVEL); + TwosideKeeper.log(ChatColor.WHITE+"Adding Potion Effect "+type.getName()+" "+WorldShop.toRomanNumeral((amplifier+1))+"("+amplifier+") to "+p.getName()+" with "+ticks+" tick duration. "+((force)?ChatColor.RED+"FORCED":""), 5); if (p.hasPotionEffect(type)) { TwosideKeeper.log(ChatColor.YELLOW+" Already had effect on Player "+p.getName()+". "+type.getName()+" "+WorldShop.toRomanNumeral((getPotionEffectLevel(type,p)+1))+"("+getPotionEffectLevel(type,p)+"), Duration: "+getPotionEffectDuration(type,p)+" ticks", TwosideKeeper.POTION_DEBUG_LEVEL); if (!force) { @@ -3112,9 +3143,36 @@ public class GenericFunctions { UpdateVials(item); UpdateHuntersCompass(item); UpdateUpgradeShard(item); + UpdateOldQuivers(item); return item; } + private static void UpdateOldQuivers(ItemStack item) { + if (item!=null && + item.getType()==Material.TIPPED_ARROW && + item.getEnchantmentLevel(Enchantment.ARROW_INFINITE)==5) { + //This might be an old arrow quiver. + if (!ArrowQuiver.isValidQuiver(item)) { + //Okay, we convert this with a brand new ID. + int amt = playerGetOldArrowQuiverAmt(item); + ItemMeta m = CustomItem.ArrowQuiver().getItemMeta(); + item.setItemMeta(m); + ArrowQuiver.setID(item); + item.addUnsafeEnchantments(CustomItem.ArrowQuiver().getEnchantments()); + ArrowQuiver.addContents(ArrowQuiver.getID(item), new ItemStack(Material.ARROW,amt)); + ArrowQuiver.updateQuiverLore(item); + } + } + } + + /** + * Legacy code to help turn an old arrow quiver into a new one. Gets the amount of arrows in an old quiver. + */ + private static int playerGetOldArrowQuiverAmt(ItemStack ArrowQuiver) { + int ArrowQuiver_amt = Integer.parseInt(ArrowQuiver.getItemMeta().getLore().get(1).split(": "+ChatColor.YELLOW)[1]); + return ArrowQuiver_amt; + } + public static void UpdateArtifactItemType(ItemStack item) { if (isArtifactArmor(item) && item.getType()!=Material.SULPHUR) { @@ -3526,24 +3584,44 @@ public class GenericFunctions { } } } - public static void DealDamageToNearbyMobs(Location l, double basedmg, int range, boolean knockup, double knockupamt, Entity damager, ItemStack weapon, boolean isLineDrive) { + DealDamageToNearbyMobs(l,basedmg,range,knockup,knockupamt,damager,weapon,isLineDrive,(isLineDrive)?"Line Drive":null); + } + + public static void DealDamageToNearbyMobs(Location l, double basedmg, double range, boolean knockup, double knockupamt, Entity damager, ItemStack weapon, boolean isLineDrive, String reason) { Collection ents = l.getWorld().getNearbyEntities(l, range, range, range); //We cleared the non-living entities, deal damage to the rest. double origdmg = basedmg; for (Entity e : ents) { - if (e instanceof LivingEntity && !e.equals(damager)) { + if (e instanceof LivingEntity && !(e instanceof Player) && !e.equals(damager)) { LivingEntity m = (LivingEntity)e; if (enoughTicksHavePassed(m,(Player)damager)) { basedmg=origdmg; + boolean isForcefulStrike = (reason!=null && reason.equalsIgnoreCase("forceful strike")); + boolean isSweepUp = (reason!=null && reason.equalsIgnoreCase("sweep up")); + if (isSweepUp) { + aPlugin.API.sendSoundlessExplosion(m.getLocation(), 1.5f); + if (damager instanceof Player) { + Player p = (Player)damager; + p.playEffect(m.getLocation(), Effect.LAVA_POP, null); + } + } + if (isForcefulStrike) { + GenericFunctions.addSuppressionTime(m, 20*2); + } if (isLineDrive) { basedmg*=1.0d+(4*((CustomDamage.getPercentHealthMissing(m))/100d)); - CustomDamage.ApplyDamage(basedmg, damager, m, weapon, "Line Drive"); + if (CustomDamage.ApplyDamage(basedmg, damager, m, weapon, "Line Drive")) { + if (knockup) { + m.setVelocity(new Vector(0,knockupamt,0)); + } + } } else { - CustomDamage.ApplyDamage(basedmg, damager, m, weapon, null); - } - if (knockup) { - m.setVelocity(new Vector(0,knockupamt,0)); + if (CustomDamage.ApplyDamage(basedmg, damager, m, weapon, reason)) { + if (knockup) { + m.setVelocity(new Vector(0,knockupamt,0)); + } + } } //TwosideKeeperAPI.DealDamageToEntity(basedmg, m, damager,"Line Drive"); if (m.isDead() && isLineDrive) { @@ -3856,11 +3934,11 @@ public class GenericFunctions { * @param type * @param maxlv The maximum level (Represented as a POTION level, not in-game displayed level. */ - public static void addStackingPotionEffect(Player p, PotionEffectType type, int tick_duration, int maxlv) { + public static void addStackingPotionEffect(LivingEntity p, PotionEffectType type, int tick_duration, int maxlv) { addStackingPotionEffect(p,type,tick_duration,maxlv,1); } - public static void addStackingPotionEffect(Player p, PotionEffectType type, int tick_duration, int maxlv, int incr_amt) { + public static void addStackingPotionEffect(LivingEntity p, PotionEffectType type, int tick_duration, int maxlv, int incr_amt) { final int BUFFER = 20*20; //20 extra seconds difference required to prevent buffs from being overwritten by this method. if (p.hasPotionEffect(type)) { int duration = getPotionEffectDuration(type,p); @@ -3870,7 +3948,7 @@ public class GenericFunctions { logAndApplyPotionEffectToEntity(neweffect.getType(), neweffect.getDuration(),neweffect.getAmplifier(), p, true); } } else { - PotionEffect neweffect = new PotionEffect(type,tick_duration,0); + PotionEffect neweffect = new PotionEffect(type,tick_duration,incr_amt-1); logAndApplyPotionEffectToEntity(neweffect.getType(), neweffect.getDuration(),neweffect.getAmplifier(), p, true); } } @@ -3972,7 +4050,6 @@ public class GenericFunctions { pw.println(message); pw.flush(); pw.close(); - } catch (IOException e) { e.printStackTrace(); } @@ -4011,82 +4088,86 @@ public class GenericFunctions { } public static void PerformLineDrive(Player p, ItemStack weaponused, boolean second_charge) { - PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); - boolean ex_version = ItemSet.hasFullSet(GenericFunctions.getEquipment(p), p, ItemSet.PANROS); - Vector facing = p.getLocation().getDirection(); - if (!second_charge) { - facing = p.getLocation().getDirection().setY(0); - logAndApplyPotionEffectToEntity(PotionEffectType.SLOW,(ex_version)?7:15,20,p); - } - if (!ex_version || second_charge) { - aPlugin.API.sendCooldownPacket(p, weaponused, GetModifiedCooldown(TwosideKeeper.LINEDRIVE_COOLDOWN,p)); - pd.last_strikerspell=TwosideKeeper.getServerTickTime(); - } - p.playSound(p.getLocation(), Sound.UI_BUTTON_CLICK, 1.0f, 1.0f); - aPlugin.API.damageItem(p, weaponused, (weaponused.getType().getMaxDurability()/10)+7); - final Player p1 = p; - - int mult=2; - final double xspd=p.getLocation().getDirection().getX()*mult; - double tempyspd=0; - final double yspd=tempyspd; - final double zspd=p.getLocation().getDirection().getZ()*mult; - final double xpos=p.getLocation().getX(); - final double ypos=p.getLocation().getY(); - final double zpos=p.getLocation().getZ(); + PlayerLineDriveEvent ev = new PlayerLineDriveEvent(p); + Bukkit.getPluginManager().callEvent(ev); + if (!ev.isCancelled()) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + boolean ex_version = ItemSet.hasFullSet(GenericFunctions.getEquipment(p), p, ItemSet.PANROS); + Vector facing = p.getLocation().getDirection(); + if (!second_charge) { + facing = p.getLocation().getDirection().setY(0); + logAndApplyPotionEffectToEntity(PotionEffectType.SLOW,(ex_version)?7:15,20,p); + } + if (!ex_version || second_charge) { + aPlugin.API.sendCooldownPacket(p, weaponused, GetModifiedCooldown(TwosideKeeper.LINEDRIVE_COOLDOWN,p)); + pd.last_strikerspell=TwosideKeeper.getServerTickTime(); + } + p.playSound(p.getLocation(), Sound.UI_BUTTON_CLICK, 1.0f, 1.0f); + aPlugin.API.damageItem(p, weaponused, (weaponused.getType().getMaxDurability()/10)+7); + final Player p1 = p; - final Vector facing1 = facing; - Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin, new Runnable() { - public void run() { - p.setVelocity(facing1.multiply(8)); - addIFrame(p, 10); - p.playSound(p.getLocation(), Sound.ITEM_CHORUS_FRUIT_TELEPORT, 1.0f, 1.0f); - final Location newpos=new Location(p.getWorld(),xpos,ypos,zpos); - double dmgdealt=CustomDamage.getBaseWeaponDamage(weaponused, p, null); - //List monsters = getNearbyMobs(newpos, 2); - List ents = new ArrayList(newpos.getWorld().getNearbyEntities(newpos, 2, 2, 2)); - List monsters = CustomDamage.trimNonMonsterEntities(ents); - for (int i=0;i monsters = getNearbyMobs(newpos, 2); + List ents = new ArrayList(newpos.getWorld().getNearbyEntities(newpos, 2, 2, 2)); + List monsters = CustomDamage.trimNonMonsterEntities(ents); + for (int i=0;iTwosideKeeper.getServerTickTime()) { + message = ChatColor.RED+" !! RAGE ACTIVE !! "+message; + } + if (important || (pd.lastimportantactionbarmsg+200) { @@ -4312,4 +4397,199 @@ public class GenericFunctions { TwosideKeeper.log("Elite Monster for monster "+target.getName()+" UNDEFINED. Defaulting to EliteZombie type.", 0); return new EliteZombie(target); } + + public static boolean AllowedToBeEquippedToOffHand(Player p, ItemStack item, int clickedslot) { + //TwosideKeeper.log("Slot:"+clickedslot, 0); 36-44 is hotbar. + return (ArrowQuiver.isValidQuiver(item)); /*|| + (item.getType()==Material.SHIELD && (clickedslot<36 || !p.getEquipment().getItemInMainHand().equals(p.getInventory().getContents()[clickedslot-36])) && (PlayerMode.isDefender(p) || PlayerMode.isNormal(p))));*/ + } + + public static boolean isValidArrow(ItemStack item) { + return isValidArrow(item,false); + } + + public static boolean isValidArrow(ItemStack item, boolean includeQuivers) { + if (item!=null && item.getType().name().contains("ARROW")) { + if (ArrowQuiver.isValidQuiver(item) && includeQuivers) { + return true; + } else + if (!ArrowQuiver.isValidQuiver(item)) { + return true; + } else { + return false; + } + } else { + return false; + } + } + + public static double calculateInfinityChance(Player p) { + return calculateInfinityChance(p.getEquipment().getItemInMainHand()); + } + + public static double calculateInfinityChance(ItemStack bow) { + if (bow.getType()==Material.BOW && + bow.containsEnchantment(Enchantment.ARROW_INFINITE)) { + return bow.getEnchantmentLevel(Enchantment.ARROW_INFINITE)*0.1d; + } else { + return 0.0; + } + } + + public static int getBasePotionDuration(PotionData bpd) { + boolean extended = bpd.isExtended(); + boolean upgraded = bpd.isUpgraded(); + if (bpd.getType()==PotionType.FIRE_RESISTANCE || + bpd.getType()==PotionType.INVISIBILITY || + bpd.getType()==PotionType.JUMP || + bpd.getType()==PotionType.NIGHT_VISION || + bpd.getType()==PotionType.POISON || + bpd.getType()==PotionType.REGEN || + bpd.getType()==PotionType.SPEED || + bpd.getType()==PotionType.STRENGTH || + bpd.getType()==PotionType.WATER_BREATHING) { + return (extended?20*0+(1200*8):upgraded?20*30+(1200*1):20*0+(1200*3)); + } + if (bpd.getType()==PotionType.LUCK) { + return (20*0+(1200*5)); + } + if (bpd.getType()==PotionType.POISON || + bpd.getType()==PotionType.SLOWNESS || + bpd.getType()==PotionType.WEAKNESS) { + return (extended?20*0+(1200*4):20*30+(1200*1)); + } + return 0; + } + + public static PotionEffectType convertPotionTypeToPotionEffectType(PotionType pt) { + switch (pt) { + case FIRE_RESISTANCE: + return PotionEffectType.FIRE_RESISTANCE; + case INSTANT_DAMAGE: + return PotionEffectType.HARM; + case INSTANT_HEAL: + return PotionEffectType.HEAL; + case INVISIBILITY: + return PotionEffectType.INVISIBILITY; + case JUMP: + return PotionEffectType.JUMP; + case LUCK: + return PotionEffectType.LUCK; + case NIGHT_VISION: + return PotionEffectType.NIGHT_VISION; + case POISON: + return PotionEffectType.POISON; + case REGEN: + return PotionEffectType.REGENERATION; + case SLOWNESS: + return PotionEffectType.SLOW; + case SPEED: + return PotionEffectType.SPEED; + case STRENGTH: + return PotionEffectType.INCREASE_DAMAGE; + case WATER_BREATHING: + return PotionEffectType.WATER_BREATHING; + case WEAKNESS: + return PotionEffectType.WEAKNESS; + default: + return PotionEffectType.HARM; + } + } + + /** + * Attempts to heal the entity provided. This verifies that we do not + * surpass the maximum health of the entity. + */ + public static void HealEntity(LivingEntity p, double healamt) { + if (p.getHealth()+healamt list = GenericFunctions.getNearbyMobs(p.getLocation(), 8); + List poisonlist = new ArrayList(); + int totalpoisonstacks = 0; + for (LivingEntity ent : list) { + if (!(ent instanceof Player)) { + boolean haspoison=false; + if (ent.hasPotionEffect(PotionEffectType.POISON)) { + int poisonlv = GenericFunctions.getPotionEffectLevel(PotionEffectType.POISON, ent); + totalpoisonstacks+=poisonlv+1; + haspoison=true; + } + if (ent.hasPotionEffect(PotionEffectType.BLINDNESS)) { + int blindnesslv = GenericFunctions.getPotionEffectLevel(PotionEffectType.BLINDNESS, ent); + totalpoisonstacks+=blindnesslv+1; + haspoison=true; + } + if (haspoison) { + poisonlist.add(ent); + } + } + } + if (totalpoisonstacks>0) { + pd.last_siphon=TwosideKeeper.getServerTickTime(); + p.playSound(p.getLocation(), Sound.BLOCK_FENCE_GATE_OPEN, 1.0f, 0.4f); + aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), GetModifiedCooldown(TwosideKeeper.SIPHON_COOLDOWN,p)); + for (LivingEntity ent : poisonlist) { + //Refresh poison stacks if necessary. + int totalpoisonlv = 0; + if (ent.hasPotionEffect(PotionEffectType.POISON)) { + int poisonlv = GenericFunctions.getPotionEffectLevel(PotionEffectType.POISON, ent); + int poisondur = GenericFunctions.getPotionEffectDuration(PotionEffectType.POISON, ent); + totalpoisonlv+=poisonlv+1; + if (poisondur<20*15) { + GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.POISON, 20*15, poisonlv, ent, true); + } + GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.SLOW, 20*15, poisonlv, ent); + } + if (ent.hasPotionEffect(PotionEffectType.BLINDNESS)) { + int poisonlv = GenericFunctions.getPotionEffectLevel(PotionEffectType.BLINDNESS, ent); + int poisondur = GenericFunctions.getPotionEffectDuration(PotionEffectType.BLINDNESS, ent); + totalpoisonlv+=poisonlv+1; + if (poisondur<20*15) { + GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.BLINDNESS, 20*15, poisonlv, ent, true); + } + GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.SLOW, 20*15, poisonlv, ent); + } + CustomDamage.ApplyDamage(totalpoisonlv*10, p, ent, null, "Siphon", CustomDamage.TRUEDMG|CustomDamage.IGNOREDODGE|CustomDamage.IGNORE_DAMAGE_TICK); + } + CustomDamage.setAbsorptionHearts(p, CustomDamage.getAbsorptionHearts(p)+totalpoisonstacks*4); + } + } + } + } + + } diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/Common/RecipeLinker.java b/src/sig/plugin/TwosideKeeper/HelperStructures/Common/RecipeLinker.java index 7a95f7d..6cfdd31 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/Common/RecipeLinker.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/Common/RecipeLinker.java @@ -350,6 +350,12 @@ public enum RecipeLinker { Recipes.getArrowFromMeta("POISON_ARR"), new ItemStack(Material.RAW_FISH,1,(short)3),new ItemStack(Material.STICK),null, new ItemStack(Material.FEATHER), + }), + piercingarrow("Custom Arrows",ChatColor.GREEN,"Piercing Arrow",new ItemStack[]{ + Recipes.getArrowFromMeta("PIERCING_ARR"), + new ItemStack(Material.REDSTONE,1),new ItemStack(Material.REDSTONE,1),new ItemStack(Material.REDSTONE,1), + new ItemStack(Material.REDSTONE,1),new ItemStack(Material.FEATHER),new ItemStack(Material.FLINT), + new ItemStack(Material.STICK), }); String name = ""; diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/CustomItem.java b/src/sig/plugin/TwosideKeeper/HelperStructures/CustomItem.java index 2528b87..87ece90 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/CustomItem.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/CustomItem.java @@ -6,14 +6,24 @@ import java.util.List; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Item; +import org.bukkit.entity.TippedArrow; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.ShapelessRecipe; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionData; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.potion.PotionType; import sig.plugin.TwosideKeeper.Artifact; import sig.plugin.TwosideKeeper.Recipes; import sig.plugin.TwosideKeeper.TwosideKeeper; +import sig.plugin.TwosideKeeper.HelperStructures.Common.ArrowQuiver; import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions; public class CustomItem { @@ -100,6 +110,17 @@ public class CustomItem { TwosideKeeper.TRAPPING_ARROW_RECIPE = TrappingArrowRecipe(); TwosideKeeper.EXPLODING_ARROW_RECIPE = ExplodingArrowRecipe(); TwosideKeeper.POISON_ARROW_RECIPE = PoisonArrowRecipe(); + TwosideKeeper.PIERCING_ARROW_RECIPE = PiercingArrowRecipe(); + } + + private static ShapelessRecipe PiercingArrowRecipe() { + ItemStack piercingarrow = Recipes.getArrowFromMeta("PIERCING_ARR"); + ShapelessRecipe piercingarrow_recipe = new ShapelessRecipe(piercingarrow); + piercingarrow_recipe.addIngredient(Material.FLINT); + piercingarrow_recipe.addIngredient(4,Material.REDSTONE); + piercingarrow_recipe.addIngredient(Material.STICK); + piercingarrow_recipe.addIngredient(Material.FEATHER); + return piercingarrow_recipe; } @SuppressWarnings("deprecation") @@ -146,6 +167,67 @@ public class CustomItem { handmadearrow_recipe.addIngredient(Material.FEATHER); return handmadearrow_recipe; } + + //Returns null if none found. This means you should probably just leave the arrow as it is. + public static ItemStack convertArrowEntityFromMeta(Arrow arrow) { + if (arrow.hasMetadata("DOUBLE_DAMAGE_ARR")) { + return Recipes.getArrowFromMeta("DOUBLE_DAMAGE_ARR"); + } + if (arrow.hasMetadata("QUADRUPLE_DAMAGE_ARR")) { + return Recipes.getArrowFromMeta("QUADRUPLE_DAMAGE_ARR"); + } + if (arrow.hasMetadata("TRAP_ARR")) { + return Recipes.getArrowFromMeta("TRAP_ARR"); + } + if (arrow.hasMetadata("EXPLODE_ARR")) { + return Recipes.getArrowFromMeta("EXPLODE_ARR"); + } + if (arrow.hasMetadata("POISON_ARR")) { + return Recipes.getArrowFromMeta("POISON_ARR"); + } + if (arrow.hasMetadata("PIERCING_ARR")) { + return Recipes.getArrowFromMeta("PIERCING_ARR"); + } + if (arrow.hasMetadata("SPECTRAL_ARROW")) { + return new ItemStack(Material.SPECTRAL_ARROW); + } + if (arrow.hasMetadata("TIPPED_ARROW") || arrow.hasMetadata("BASE_ARROW") || arrow instanceof TippedArrow) { + if (arrow instanceof TippedArrow) { + ItemStack item = new ItemStack(Material.TIPPED_ARROW); + PotionMeta pm = (PotionMeta)item.getItemMeta(); + for (PotionEffect eff : ((TippedArrow)arrow).getCustomEffects()) { + pm.addCustomEffect(eff, true); + } + pm.setBasePotionData(((TippedArrow)arrow).getBasePotionData()); + item.setItemMeta(pm); + TwosideKeeper.log("This item is "+item.toString(), 5); + return item; + } else { + ItemStack item = new ItemStack(Material.TIPPED_ARROW); + PotionMeta pm = (PotionMeta)item.getItemMeta(); + if (arrow.hasMetadata("TIPPED_ARROW")) { + String effects = arrow.getMetadata("TIPPED_ARROW").get(0).asString(); + for (String vals : effects.split(";")) { + String[] pieces = vals.split(","); + pm.addCustomEffect(new PotionEffect(PotionEffectType.getByName(pieces[0]),Integer.parseInt(pieces[1]),Integer.parseInt(pieces[2])),true); + } + } + if (arrow.hasMetadata("BASE_ARROW")) { + String[] pieces = arrow.getMetadata("BASE_ARROW").get(0).asString().split(","); + TwosideKeeper.log("Found Base Arrow. Pieces: "+pieces.toString(), 5); + if (PotionType.valueOf(pieces[0])!=PotionType.WATER) { + PotionData pd = new PotionData(PotionType.valueOf(pieces[0]),Boolean.parseBoolean(pieces[1]),Boolean.parseBoolean(pieces[2])); + TwosideKeeper.log("Applying"+pd.toString(), 5); + pm.setBasePotionData(pd); + } + } + item.setItemMeta(pm); + TwosideKeeper.log("This item is "+item.toString(), 5); + return item; + } + } + return null; + } private static ShapelessRecipe CheckRecipe() { ItemStack check = MoneyCheck(); @@ -286,16 +368,17 @@ public class CustomItem { ItemStack arrow_quiver = new ItemStack(Material.TIPPED_ARROW); List arrow_quiver_lore = new ArrayList(); - arrow_quiver_lore.add("A quiver that holds many arrows."); - arrow_quiver_lore.add(ChatColor.GRAY+"Arrows Remaining: "+ChatColor.YELLOW+"5"); + arrow_quiver_lore.add(ArrowQuiver.ARROW_QUIVER_IDENTIFIER); + arrow_quiver_lore.add(ArrowQuiver.ID_PREFIX+"1"); ItemMeta arrow_quiver_meta=arrow_quiver.getItemMeta(); + arrow_quiver_meta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS); + arrow_quiver_meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); arrow_quiver_meta.setLore(arrow_quiver_lore); arrow_quiver_meta.setDisplayName(ChatColor.BLUE+"Arrow Quiver"); arrow_quiver.setItemMeta(arrow_quiver_meta); - arrow_quiver.addUnsafeEnchantment(Enchantment.ARROW_INFINITE, 5); - arrow_quiver.setAmount(1); + arrow_quiver.addUnsafeEnchantment(Enchantment.ARROW_INFINITE, 5); return arrow_quiver; } diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/ItemSet.java b/src/sig/plugin/TwosideKeeper/HelperStructures/ItemSet.java index 20d5af9..b31f316 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/ItemSet.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/ItemSet.java @@ -14,9 +14,9 @@ import sig.plugin.TwosideKeeper.TwosideKeeper; import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions; public enum ItemSet { - PANROS(1,1, 3,2, 10,10, 20,10), + PANROS(1,1, 6,4, 10,10, 20,10), SONGSTEEL(4,2, 6,2, 8,8, 20,10), - DAWNTRACKER(4,4, 20,10, 20,10, 6,4), + DAWNTRACKER(2,1, 20,10, 20,10, 10,5), LORASYS(2,2, 0,0, 0,0, 0,0), JAMDAK(3,3, 5,1, 10,1, 10,2), //Graceful Dodge is in ticks. DARNYS(2,1, 10,5, 20,5, 1,1), @@ -25,7 +25,7 @@ public enum ItemSet { MOONSHADOW(4,2, 1,1, 8,8, 15,7), GLADOMAIN(1,1, 12,10, 8,8, 1,1), WOLFSBANE(2,1, 15,10, 10,5, 15,10), - ALUSTINE(10,10, 10,-1, 5,-1, 6,4); + ALUSTINE(3,2, 300,-30, 50,-5, 6,2); int baseval; int increase_val; @@ -238,7 +238,7 @@ public enum ItemSet { case DAWNTRACKER:{ lore.add(ChatColor.LIGHT_PURPLE+"Barbarian Gear"); lore.add(ChatColor.GOLD+""+ChatColor.BOLD+"T"+tier+" Dawntracker Set"); - lore.add(ChatColor.YELLOW+"+"+ItemSet.GetBaseAmount(set, tier, 1)+" Health"); + lore.add(ChatColor.YELLOW+"-"+(ItemSet.GetBaseAmount(set, tier, 1)/2)+" Health taken per hit"); }break; case LORASYS:{ lore.add(ChatColor.LIGHT_PURPLE+"Slayer Gear"); @@ -315,10 +315,12 @@ public enum ItemSet { lore.add(ChatColor.GOLD+""+ChatColor.ITALIC+"Set Bonus:"); lore.add(ChatColor.DARK_AQUA+" 2 - "+ChatColor.WHITE+" +"+ItemSet.GetBaseAmount(set, tier, 2)+"% Debuff Resistance"); lore.add(ChatColor.DARK_AQUA+" 3 - "+ChatColor.WHITE+" +"+ItemSet.GetBaseAmount(set, tier, 3)+"% Lifesteal"); - lore.add(ChatColor.DARK_AQUA+" 4 - "+ChatColor.WHITE+" +"+ItemSet.GetBaseAmount(set, tier, 4)+" Damage"); + lore.add(ChatColor.DARK_AQUA+" 4 - "+ChatColor.WHITE+" +"+ItemSet.GetBaseAmount(set, tier, 4)+" Max Health"); lore.add(ChatColor.DARK_AQUA+" 5 - "+ChatColor.WHITE+" Powered Mock"); lore.add(ChatColor.GRAY+" Mock debuff duration increases from"); lore.add(ChatColor.GRAY+" 10 -> 20 seconds, making it stackable."); + lore.add(ChatColor.GRAY+" All Lifesteal Stacks and Weapon Charges"); + lore.add(ChatColor.GRAY+" gained are doubled."); }break; case LORASYS:{ lore.add(ChatColor.GOLD+""+ChatColor.ITALIC+"Bonus Effects"); @@ -434,11 +436,14 @@ public enum ItemSet { case ALUSTINE:{ lore.add(ChatColor.GOLD+""+ChatColor.ITALIC+"Set Bonus:"); lore.add(ChatColor.DARK_AQUA+" 2 - "+ChatColor.WHITE+" Gain immunity to Explosions."); - lore.add(ChatColor.DARK_AQUA+" "+ChatColor.WHITE+" Consumes "+ItemSet.GetBaseAmount(set, tier, 2)+" XP per absorbed hit."); + lore.add(ChatColor.DARK_AQUA+" "+ChatColor.WHITE+" Consumes "+ChatColor.YELLOW+ItemSet.GetBaseAmount(set, tier, 2)+" XP"+ChatColor.WHITE+" per absorbed hit."); + lore.add(ChatColor.DARK_AQUA+" "+ChatColor.GRAY+ChatColor.ITALIC+"Must have at least "+ChatColor.YELLOW+ChatColor.ITALIC+ItemSet.GetBaseAmount(set, tier, 2)+" XP"+ChatColor.GRAY+ChatColor.ITALIC+" to trigger."); lore.add(ChatColor.DARK_AQUA+" 3 - "+ChatColor.WHITE+" Resists all fire, poison, and wither damage."); - lore.add(ChatColor.DARK_AQUA+" "+ChatColor.WHITE+" Consumes "+ItemSet.GetBaseAmount(set, tier, 3)+" XP per absorbed hit."); - lore.add(ChatColor.DARK_AQUA+" 5 - "+ChatColor.WHITE+" Backstabs spill "+ItemSet.GetBaseAmount(set, tier, 4)+" XP out from the target hit."); - lore.add(ChatColor.DARK_AQUA+" "+ChatColor.WHITE+" Has a "+Math.min((ItemSet.GetBaseAmount(set, tier, 4)/20d)*100d,100)+"% chance to restore 2 HP (1 Heart) on XP gain."); + lore.add(ChatColor.DARK_AQUA+" "+ChatColor.WHITE+" Consumes "+ChatColor.YELLOW+ItemSet.GetBaseAmount(set, tier, 3)+" XP"+ChatColor.WHITE+" per absorbed hit."); + lore.add(ChatColor.DARK_AQUA+" "+ChatColor.GRAY+ChatColor.ITALIC+"Must have at least "+ChatColor.YELLOW+ChatColor.ITALIC+ItemSet.GetBaseAmount(set, tier, 3)+" XP"+ChatColor.GRAY+ChatColor.ITALIC+" to trigger."); + lore.add(ChatColor.DARK_AQUA+" 5 - "+ChatColor.WHITE+" Backstabs spill "+ChatColor.YELLOW+ItemSet.GetBaseAmount(set, tier, 4)+" XP"+ChatColor.WHITE+" out from the target hit."); + lore.add(ChatColor.DARK_AQUA+" "+ChatColor.WHITE+" Collecting experience has a "+Math.min((ItemSet.GetBaseAmount(set, tier, 4)/20d)*100d,100)+"% chance"); + lore.add(ChatColor.DARK_AQUA+" "+ChatColor.WHITE+" to restore 2 HP (1 Heart)."); lore.add(ChatColor.DARK_AQUA+" 7 - "+ChatColor.WHITE+" Provides the Following Bonuses:"); lore.add(ChatColor.GRAY+" "+ChatColor.WHITE+"Deal additional base damage equal to the"); lore.add(ChatColor.GRAY+" "+ChatColor.WHITE+"number of levels you have. Drains XP equal"); diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/MonsterDifficulty.java b/src/sig/plugin/TwosideKeeper/HelperStructures/MonsterDifficulty.java index 5caabe1..929d54c 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/MonsterDifficulty.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/MonsterDifficulty.java @@ -158,7 +158,9 @@ public enum MonsterDifficulty { } else if (goodie.getType()!=Material.SKULL_ITEM && (set==ItemSet.MOONSHADOW || - set==ItemSet.GLADOMAIN)) { + set==ItemSet.GLADOMAIN || + set==ItemSet.WOLFSBANE || + set==ItemSet.ALUSTINE)) { goodie.setType(Material.SKULL_ITEM); } return goodie; @@ -172,7 +174,7 @@ public enum MonsterDifficulty { } } - public static ItemSet PickAnItemSet(PlayerMode pm) { + public static ItemSet PickAnItemSet(PlayerMode pm, MonsterDifficulty md) { ItemSet set; switch (pm) { case STRIKER:{ @@ -208,21 +210,30 @@ public enum MonsterDifficulty { if (selectweight<10) { set = ItemSet.LORASYS; } else - if (selectweight<80) { - set = ItemSet.MOONSHADOW; - } else - { - set = ItemSet.GLADOMAIN; + switch (md) { + case DANGEROUS:{ + set = ItemSet.ALUSTINE; + } + case DEADLY:{ + set = ItemSet.MOONSHADOW; + } + case HELLFIRE: + case END:{ + set = ItemSet.GLADOMAIN; + } + default:{ + set = ItemSet.WOLFSBANE; + } } }break; default:{ - set = PickRandomSet(); + set = PickRandomSet(md); } } return set; } - public static ItemSet PickRandomSet() { + public static ItemSet PickRandomSet(MonsterDifficulty md) { final int NUMBER_OF_MODES=5; int totalweight=50*NUMBER_OF_MODES; //50 for each mode. int selectweight=(int)(Math.random()*totalweight); @@ -254,10 +265,20 @@ public enum MonsterDifficulty { if (selectweight<205) { return ItemSet.LORASYS; } else - if (selectweight<223) { - return ItemSet.GLADOMAIN; - } else { - return ItemSet.MOONSHADOW; + switch (md) { + case DANGEROUS:{ + return ItemSet.ALUSTINE; + } + case DEADLY:{ + return ItemSet.MOONSHADOW; + } + case HELLFIRE: + case END:{ + return ItemSet.GLADOMAIN; + } + default:{ + return ItemSet.WOLFSBANE; + } } } return ItemSet.PANROS; diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/PlayerMode.java b/src/sig/plugin/TwosideKeeper/HelperStructures/PlayerMode.java index e2d2f2c..7cca053 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/PlayerMode.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/PlayerMode.java @@ -6,6 +6,7 @@ import org.bukkit.entity.Player; import sig.plugin.TwosideKeeper.PlayerStructure; import sig.plugin.TwosideKeeper.TwosideKeeper; +import sig.plugin.TwosideKeeper.HelperStructures.Common.ArrowQuiver; import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions; public enum PlayerMode { @@ -21,7 +22,7 @@ public enum PlayerMode { + ChatColor.WHITE+"->Hitting a target when they have not noticed you yet does x3 normal damage.\n"), RANGER(ChatColor.DARK_GREEN,"R","Ranger", ChatColor.DARK_GREEN+""+ChatColor.BOLD+"Ranger mode Perks: "+ChatColor.RESET+"\n" - + ChatColor.WHITE+"->Players are identified as 'Rangers' when they carry a bow in their main hand. Off-hand items are permitted, except for a shield. Can only be wearing leather armor, or no armor.\n" + + ChatColor.WHITE+"->Players are identified as 'Rangers' when they carry a bow or a quiver in one of their hands. Off-hand items are permitted, except for a shield. Can only be wearing leather armor, or no armor.\n" + ChatColor.GRAY+"->Left-clicking mobs will cause them to be knocked back extremely far, basically in headshot range, when walls permit.\n" + ChatColor.WHITE+"->Base Arrow Damage increases from x2->x4.\n" + ChatColor.GRAY+"->You can dodge 50% of all incoming attacks from any damage sources.\n" @@ -102,6 +103,9 @@ public enum PlayerMode { if (Check_isStriker(p)) { pd.lastmode=PlayerMode.STRIKER; } else + if (Check_isBarbarian(p)) { + pd.lastmode=PlayerMode.BARBARIAN; + } else if (Check_isDefender(p)) { pd.lastmode=PlayerMode.DEFENDER; } else @@ -173,6 +177,32 @@ public enum PlayerMode { } else { return false; } + } + + public static boolean isBarbarian(Player p) { + if (p!=null && !p.isDead()) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + if (needsUpdating(pd)) { + return getPlayerMode(p)==PlayerMode.BARBARIAN; + } else { + return pd.lastmode==PlayerMode.BARBARIAN; + } + } else { + return false; + } + } + + public static boolean isNormal(Player p) { + if (p!=null && !p.isDead()) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + if (needsUpdating(pd)) { + return getPlayerMode(p)==PlayerMode.NORMAL; + } else { + return pd.lastmode==PlayerMode.NORMAL; + } + } else { + return false; + } } @@ -180,10 +210,10 @@ public enum PlayerMode { if (p!=null && !p.isDead()) { PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); if (needsUpdating(pd)) { - if ((((p.getEquipment().getItemInMainHand()!=null && p.getEquipment().getItemInMainHand().getType()==Material.BOW && (p.getInventory().getExtraContents()[0]==null || p.getInventory().getExtraContents()[0].getType()==Material.AIR)) || //Satisfy just a bow in main hand. - (p.getEquipment().getItemInMainHand()!=null && p.getEquipment().getItemInMainHand().getType()==Material.BOW && p.getInventory().getExtraContents()[0]!=null && !GenericFunctions.isEquip(p.getInventory().getExtraContents()[0])) || /*Satisfy a bow in main hand and no shield in off-hand.*/ - (p.getEquipment().getItemInMainHand()!=null && !GenericFunctions.isEquip(p.getEquipment().getItemInMainHand()) && p.getInventory().getExtraContents()[0]!=null && p.getInventory().getExtraContents()[0].getType()==Material.BOW) || /*Satisfy a bow in off-hand and no shield in main hand.*/ - ((p.getEquipment().getItemInMainHand()==null || p.getEquipment().getItemInMainHand().getType()==Material.AIR) && p.getInventory().getExtraContents()[0]!=null && p.getInventory().getExtraContents()[0].getType()==Material.BOW)) /*Satisfy just a bow in off-hand.*/ && + if ((((p.getEquipment().getItemInMainHand()!=null && (p.getEquipment().getItemInMainHand().getType()==Material.BOW || ArrowQuiver.isValidQuiver(p.getEquipment().getItemInMainHand())) && (p.getInventory().getExtraContents()[0]==null || p.getInventory().getExtraContents()[0].getType()==Material.AIR)) || //Satisfy just a bow/quiver in main hand. + (p.getEquipment().getItemInMainHand()!=null && (p.getEquipment().getItemInMainHand().getType()==Material.BOW || ArrowQuiver.isValidQuiver(p.getEquipment().getItemInMainHand())) && p.getInventory().getExtraContents()[0]!=null && !GenericFunctions.isEquip(p.getInventory().getExtraContents()[0])) || /*Satisfy a bow/quiver in main hand and no shield in off-hand.*/ + (p.getEquipment().getItemInMainHand()!=null && !GenericFunctions.isEquip(p.getEquipment().getItemInMainHand()) && p.getInventory().getExtraContents()[0]!=null && (p.getInventory().getExtraContents()[0].getType()==Material.BOW || ArrowQuiver.isValidQuiver(p.getInventory().getExtraContents()[0]))) || /*Satisfy a bow/quiver in off-hand and no shield in main hand.*/ + ((p.getEquipment().getItemInMainHand()==null || p.getEquipment().getItemInMainHand().getType()==Material.AIR) && p.getInventory().getExtraContents()[0]!=null && (p.getInventory().getExtraContents()[0].getType()==Material.BOW || ArrowQuiver.isValidQuiver(p.getInventory().getExtraContents()[0])))) /*Satisfy just a bow/quiver in off-hand.*/ && GenericFunctions.AllLeatherArmor(p))) { return true; } else { @@ -250,6 +280,24 @@ public enum PlayerMode { } } + public static boolean Check_isBarbarian(Player p) { + if (p!=null && !p.isDead()) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + if (needsUpdating(pd)) { + if (p.getEquipment().getItemInMainHand()!=null && p.getEquipment().getItemInMainHand().getType().toString().contains("_AXE") && + p.getInventory().getExtraContents()[0]!=null && p.getInventory().getExtraContents()[0].getType().toString().contains("_AXE")) { + return true; + } else { + return false; + } + } else { + return pd.lastmode==PlayerMode.BARBARIAN; + } + } else { + return false; + } + } + String name=""; String desription=""; diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/Pronouns.java b/src/sig/plugin/TwosideKeeper/HelperStructures/Pronouns.java index 2000ee2..fd1f9a4 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/Pronouns.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/Pronouns.java @@ -228,6 +228,18 @@ public class Pronouns { "got tangled by webs.", }; } + case 18:{ + pronouns = new String[]{ + "took too much damage, and wilted away...", + "was a brave fighter. We will never forget.", + "could not handle the pressure, finally getting killed.", + "was not aware of how much damage they soaked up.", + "could not handle all the damage.", + "did not lifesteal fast enough.", + "braved the terrors of the world, but could not live to see another day.", + "fought until the very end of their life. But it was not enough.", + }; + } } return pronouns[(int)(Math.random()*pronouns.length)]; } diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/WorldShop.java b/src/sig/plugin/TwosideKeeper/HelperStructures/WorldShop.java index ceb05a6..40ea5e9 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/WorldShop.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/WorldShop.java @@ -32,7 +32,9 @@ import org.bukkit.inventory.meta.EnchantmentStorageMeta; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.inventory.meta.Repairable; +import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import org.bukkit.util.Vector; import sig.plugin.TwosideKeeper.Artifact; @@ -150,26 +152,17 @@ public class WorldShop { PotionMeta pot = (PotionMeta)item.getItemMeta(); if (!pot.getItemFlags().contains(ItemFlag.HIDE_POTION_EFFECTS)) { List effects = pot.getCustomEffects(); - - for (int i=0;i0)?" ":"")+"("+toReadableDuration(effects.get(i).getDuration())+")"; - } - - if (effects.size()==0) { //Try this instead. It might be a legacy potion. - - String duration = " "+(pot.getBasePotionData().isExtended()?"(8:00)":(pot.getBasePotionData().isUpgraded())?"(1:30)":"(3:00)"); - String badduration = " "+(pot.getBasePotionData().isExtended()?"(4:00)":"(1:30)"); - String luckduration = " (5:00)"; + PotionData baseeffects = pot.getBasePotionData(); + + if (baseeffects!=null) { //Try this instead. It might be a legacy potion. + int duration = GenericFunctions.getBasePotionDuration(pot.getBasePotionData()); String power = (pot.getBasePotionData().isUpgraded()?"II":""); - if (item.getType() == Material.LINGERING_POTION) { - duration = " "+(pot.getBasePotionData().isExtended()?"(2:00)":(pot.getBasePotionData().isUpgraded())?"(0:22)":"(0:45)"); - badduration = " "+(pot.getBasePotionData().isExtended()?"(1:00)":"(0:22)"); - luckduration = " (1:15)"; + if (item.getType()==Material.TIPPED_ARROW) { + duration/=8; } - switch (pot.getBasePotionData().getType()) { case FIRE_RESISTANCE: - message+="\n"+ChatColor.BLUE+"Fire Resistance"+duration; + message+="\n"+ChatColor.BLUE+"Fire Resistance ("+toReadableDuration(duration)+")"; break; case INSTANT_DAMAGE: message+="\n"+ChatColor.RED+"Instant Damage "+power; @@ -178,44 +171,50 @@ public class WorldShop { message+="\n"+ChatColor.BLUE+"Instant Health "+power; break; case INVISIBILITY: - message+="\n"+ChatColor.BLUE+"Invisibility"+duration; + message+="\n"+ChatColor.BLUE+"Invisibility ("+toReadableDuration(duration)+")"; break; case JUMP: - message+="\n"+ChatColor.BLUE+"Jump Boost "+power+duration; + message+="\n"+ChatColor.BLUE+"Leaping "+power+" ("+toReadableDuration(duration)+")"; break; case LUCK: - message+="\n"+ChatColor.BLUE+"Luck"+luckduration; + message+="\n"+ChatColor.BLUE+"Luck ("+toReadableDuration(duration)+")"; break; case NIGHT_VISION: - message+="\n"+ChatColor.BLUE+"Night Vision"+duration; + message+="\n"+ChatColor.BLUE+"Night Vision ("+toReadableDuration(duration)+")"; break; case POISON: - message+="\n"+ChatColor.RED+"Poison "+power+badduration; + message+="\n"+ChatColor.RED+"Poison "+power +" ("+toReadableDuration(duration)+")"; break; case REGEN: - message+="\n"+ChatColor.BLUE+"Regeneration "+power+duration; + message+="\n"+ChatColor.BLUE+"Regeneration "+power+" ("+toReadableDuration(duration)+")"; break; case SLOWNESS: - message+="\n"+ChatColor.RED+"Slowness"+badduration; + message+="\n"+ChatColor.RED+"Slowness ("+toReadableDuration(duration)+")"; break; case SPEED: - message+="\n"+ChatColor.BLUE+"Speed "+power+duration; + message+="\n"+ChatColor.BLUE+"Speed "+power +" ("+toReadableDuration(duration)+")"; break; case STRENGTH: - message+="\n"+ChatColor.BLUE+"Strength "+power+duration; + message+="\n"+ChatColor.BLUE+"Strength "+power +" ("+toReadableDuration(duration)+")"; break; case WATER_BREATHING: - message+="\n"+ChatColor.BLUE+"Water Breathing"+duration; + message+="\n"+ChatColor.BLUE+"Water Breathing ("+toReadableDuration(duration)+")"; break; case WEAKNESS: - message+="\n"+ChatColor.RED+"Weakness"+badduration; + message+="\n"+ChatColor.RED+"Weakness ("+toReadableDuration(duration)+")"; break; - default: - message+="\n"+ChatColor.GRAY+"No Effects"; - break; - + default: + break; } } + + for (int i=0;i0)?" ":"")+"("+toReadableDuration(duration)+")"; + } } } } @@ -469,6 +468,33 @@ public class WorldShop { return message; } + private static String divideDurationByEight(String dur) { + return dur.replace("0:22", "0:02").replace("0:45", "0:05").replace("1:00", "0:07").replace("1:15", "0:09").replace("1:30", "0:11").replace("2:00", "0:15").replace("3:00", "0:22").replace("4:00", "0:30").replace("5:00", "0:37").replace("8:00", "1:00"); + } + + private static boolean isBadPotionEffect(PotionEffectType type) { + if (type.equals(PotionEffectType.ABSORPTION) || + type.equals(PotionEffectType.DAMAGE_RESISTANCE) || + type.equals(PotionEffectType.FAST_DIGGING) || + type.equals(PotionEffectType.FIRE_RESISTANCE) || + type.equals(PotionEffectType.GLOWING) || + type.equals(PotionEffectType.HEAL) || + type.equals(PotionEffectType.HEALTH_BOOST) || + type.equals(PotionEffectType.INCREASE_DAMAGE) || + type.equals(PotionEffectType.INVISIBILITY) || + type.equals(PotionEffectType.JUMP) || + type.equals(PotionEffectType.LUCK) || + type.equals(PotionEffectType.NIGHT_VISION) || + type.equals(PotionEffectType.REGENERATION) || + type.equals(PotionEffectType.SATURATION) || + type.equals(PotionEffectType.SPEED) || + type.equals(PotionEffectType.WATER_BREATHING)) { + return false; + } else { + return true; + } + } + public static String toReadableDuration(int duration) { DecimalFormat df = new DecimalFormat("00"); return duration/1200+":"+df.format((duration/20)%60); diff --git a/src/sig/plugin/TwosideKeeper/LivingEntityStructure.java b/src/sig/plugin/TwosideKeeper/LivingEntityStructure.java index e1facac..fc0ebf9 100644 --- a/src/sig/plugin/TwosideKeeper/LivingEntityStructure.java +++ b/src/sig/plugin/TwosideKeeper/LivingEntityStructure.java @@ -21,6 +21,7 @@ public class LivingEntityStructure { public double original_movespd = 0.0d; public HashMap hitlist = new HashMap(); public HashMap glowcolorlist = new HashMap(); + public long lastSpiderBallThrow = 0; public LivingEntityStructure(LivingEntity m) { target=null; diff --git a/src/sig/plugin/TwosideKeeper/MonsterController.java b/src/sig/plugin/TwosideKeeper/MonsterController.java index c0125f3..78cf304 100644 --- a/src/sig/plugin/TwosideKeeper/MonsterController.java +++ b/src/sig/plugin/TwosideKeeper/MonsterController.java @@ -700,7 +700,7 @@ public class MonsterController { if (m.getCustomName().contains("Elite")) { return MonsterDifficulty.ELITE; } else - if (m.getCustomName().contains("End")) { + if (m.getCustomName().contains("End ")) { return MonsterDifficulty.END; } else { diff --git a/src/sig/plugin/TwosideKeeper/PlayerStructure.java b/src/sig/plugin/TwosideKeeper/PlayerStructure.java index 299ca04..50201e6 100644 --- a/src/sig/plugin/TwosideKeeper/PlayerStructure.java +++ b/src/sig/plugin/TwosideKeeper/PlayerStructure.java @@ -75,7 +75,7 @@ public class PlayerStructure { public List openeditemcube; public boolean openinginventory=false; public boolean fulldodge=false; - public long last_dodge=TwosideKeeper.getServerTickTime(); + public long last_arrowbarrage=TwosideKeeper.getServerTickTime(); public long last_laugh_time=TwosideKeeper.getServerTickTime(); public long last_rejuvenate=TwosideKeeper.getServerTickTime(); public DamageLogger damagedata; @@ -112,6 +112,11 @@ public class PlayerStructure { public double thorns_amt = 0.0; public long lastimportantactionbarmsg=0; public long lasthighwinderhit=0; + public int lifestealstacks=0; + public int weaponcharges=0; + public double damagepool=0; + public long lastattacked=0; + public int lasthitfromdamagepool=0; public long iframetime = 0; @@ -136,6 +141,12 @@ public class PlayerStructure { public long lastrightclick = 0; public boolean opened_another_cube=false; + public long damagepooltime=0; + public long last_siphon=0; + public long last_dodge=0; + public long last_mock=0; + public long rage_time=0; //Set this to the last tick that rage is supposed to last. It'll wear off after this. + public int rage_amt=0; //Needs the instance of the player object to get all other info. Only to be called at the beginning. @SuppressWarnings("deprecation") @@ -177,7 +188,7 @@ public class PlayerStructure { this.openeditemcube = new ArrayList(); this.openinginventory = false; this.fulldodge=false; - this.last_dodge=(TwosideKeeper.getServerType()==ServerType.MAIN)?TwosideKeeper.getServerTickTime():0; + this.last_arrowbarrage=(TwosideKeeper.getServerType()==ServerType.MAIN)?TwosideKeeper.getServerTickTime():0; this.lastarrowwasinrangermode=false; this.isViewingInventory=false; this.destroyedminecart=false; diff --git a/src/sig/plugin/TwosideKeeper/Recipes.java b/src/sig/plugin/TwosideKeeper/Recipes.java index b85e7eb..bc3e68f 100644 --- a/src/sig/plugin/TwosideKeeper/Recipes.java +++ b/src/sig/plugin/TwosideKeeper/Recipes.java @@ -247,6 +247,15 @@ public class Recipes { explosionarrow_recipe.addIngredient(Material.STICK); explosionarrow_recipe.addIngredient(Material.FEATHER); Bukkit.addRecipe(explosionarrow_recipe); + + ItemStack piercingarrow = getArrowFromMeta("PIERCING_ARR"); + ShapelessRecipe piercingarrow_recipe = new ShapelessRecipe(piercingarrow); + + piercingarrow_recipe.addIngredient(Material.FLINT); + piercingarrow_recipe.addIngredient(4,Material.REDSTONE); + piercingarrow_recipe.addIngredient(Material.STICK); + piercingarrow_recipe.addIngredient(Material.FEATHER); + Bukkit.addRecipe(piercingarrow_recipe); } public static void Initialize_NotchApple_Recipe() { @@ -265,7 +274,7 @@ public class Recipes { //pm.setBasePotionData(data); pm.addCustomEffect(new PotionEffect(PotionEffectType.INVISIBILITY,0,0),true); List lore = new ArrayList(); - lore.add(ChatColor.GRAY+"Explodes on Contact (+80 dmg)"); + lore.add(ChatColor.GRAY+"Explodes on Contact (+60 dmg)"); pm.setLore(lore); pm.setDisplayName(ChatColor.GRAY+"Exploding Arrow"); explosionarrow.setItemMeta(pm); @@ -304,7 +313,7 @@ public class Recipes { //pm.setBasePotionData(data); pm.addCustomEffect(new PotionEffect(PotionEffectType.SPEED,0,0),true); List lore = new ArrayList(); - lore.add(ChatColor.GRAY+"x4 Damage"); + lore.add(ChatColor.GRAY+"+15 Damage"); pm.setLore(lore); pm.setDisplayName(ChatColor.AQUA+"Diamond-Tipped Arrow"); diamondtippedarrow.setItemMeta(pm); @@ -317,12 +326,26 @@ public class Recipes { //pm.setBasePotionData(data); pm.addCustomEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE,0,0),true); List lore = new ArrayList(); - lore.add(ChatColor.GRAY+"x2 Damage"); + lore.add(ChatColor.GRAY+"+5 Damage"); pm.setLore(lore); pm.setDisplayName(ChatColor.YELLOW+"Handmade Arrow"); handmadearrow.setItemMeta(pm); return handmadearrow; } + case "PIERCING_ARR": { + ItemStack piercingarrow = new ItemStack(Material.TIPPED_ARROW); + PotionMeta pm = (PotionMeta)piercingarrow.getItemMeta(); + pm.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS); + //pm.setBasePotionData(data); + pm.addCustomEffect(new PotionEffect(PotionEffectType.HEAL,0,0),true); + List lore = new ArrayList(); + lore.add(ChatColor.GRAY+"+5 Damage"); + lore.add(ChatColor.RED+"Goes through all targets."); + pm.setLore(lore); + pm.setDisplayName(ChatColor.RED+"Piercing Arrow"); + piercingarrow.setItemMeta(pm); + return piercingarrow; + } } return new ItemStack(Material.TIPPED_ARROW); } diff --git a/src/sig/plugin/TwosideKeeper/TwosideKeeper.java b/src/sig/plugin/TwosideKeeper/TwosideKeeper.java index 1299c39..e03938d 100644 --- a/src/sig/plugin/TwosideKeeper/TwosideKeeper.java +++ b/src/sig/plugin/TwosideKeeper/TwosideKeeper.java @@ -17,8 +17,10 @@ import org.apache.commons.lang.WordUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Color; +import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.attribute.Attribute; import org.bukkit.block.Block; @@ -30,6 +32,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.AreaEffectCloud; import org.bukkit.entity.Arrow; import org.bukkit.entity.Bat; import org.bukkit.entity.Creeper; @@ -39,6 +42,7 @@ import org.bukkit.entity.ExperienceOrb; import org.bukkit.entity.FallingBlock; import org.bukkit.entity.Horse; import org.bukkit.entity.Horse.Variant; +import org.bukkit.entity.Skeleton.SkeletonType; import org.bukkit.entity.Item; import org.bukkit.entity.LightningStrike; import org.bukkit.entity.LivingEntity; @@ -46,6 +50,7 @@ import org.bukkit.entity.Monster; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.entity.Shulker; +import org.bukkit.entity.Skeleton; import org.bukkit.entity.Snowball; import org.bukkit.entity.ThrownPotion; import org.bukkit.entity.TippedArrow; @@ -113,6 +118,7 @@ import org.bukkit.event.player.PlayerPickupArrowEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerToggleSneakEvent; import org.bukkit.event.player.PlayerToggleSprintEvent; @@ -130,11 +136,13 @@ import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.ShapelessRecipe; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.LeatherArmorMeta; +import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import org.bukkit.potion.PotionType; import org.bukkit.util.Vector; import aPlugin.API.Chests; @@ -143,6 +151,8 @@ import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; +import sig.plugin.TwosideKeeper.Events.PlayerDodgeEvent; +import sig.plugin.TwosideKeeper.Events.PlayerTumbleEvent; import sig.plugin.TwosideKeeper.HelperStructures.AnvilItem; import sig.plugin.TwosideKeeper.HelperStructures.ArtifactAbility; import sig.plugin.TwosideKeeper.HelperStructures.ArtifactItem; @@ -166,6 +176,7 @@ import sig.plugin.TwosideKeeper.HelperStructures.SessionState; import sig.plugin.TwosideKeeper.HelperStructures.SpleefArena; import sig.plugin.TwosideKeeper.HelperStructures.WorldShop; import sig.plugin.TwosideKeeper.HelperStructures.WorldShopSession; +import sig.plugin.TwosideKeeper.HelperStructures.Common.ArrowQuiver; import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions; import sig.plugin.TwosideKeeper.HelperStructures.Common.Habitation; import sig.plugin.TwosideKeeper.HelperStructures.Common.RecipeLinker; @@ -352,13 +363,15 @@ public class TwosideKeeper extends JavaPlugin implements Listener { ScheduleRemoval(hellfirespiders,hs.m.getUniqueId()); } else { Monster m = hs.GetSpider(); - if (Math.random()<=0.08) { + LivingEntityStructure les = LivingEntityStructure.getLivingEntityStructure(m); + if (Math.random()<=0.24 && les.lastSpiderBallThrow+(20*4) playerdata; @@ -877,7 +895,25 @@ public class TwosideKeeper extends JavaPlugin implements Listener { if (args.length>0) { ((org.bukkit.craftbukkit.v1_9_R1.entity.CraftLivingEntity)p).getHandle().setAbsorptionHearts(Float.valueOf(args[0])); }*/ - + if (args.length>0) { + ItemStack quiver = p.getInventory().getExtraContents()[0]; + switch (args[0]) { + case "ADD":{ + ArrowQuiver.addContents(ArrowQuiver.getID(quiver), p.getInventory().getItemInMainHand()); + }break; + case "REMOVE":{ + ArrowQuiver.removeContents(ArrowQuiver.getID(quiver), p.getInventory().getItemInMainHand()); + }break; + case "GET":{ + p.sendMessage("Quiver Mode: "+ArrowQuiver.getArrowQuiverMode(quiver)); + }break; + case "SET":{ + p.sendMessage("Quiver Mode: "+ArrowQuiver.setArrowQuiverMode(quiver, Integer.parseInt(args[1]))); + p.sendMessage("Updated Quiver Mode: "+ArrowQuiver.getArrowQuiverMode(quiver)); + }break; + } + ArrowQuiver.updateQuiverLore(quiver); + } /* StackTraceElement[] stacktrace = new Throwable().getStackTrace(); StringBuilder stack = new StringBuilder("Mini stack tracer:"); @@ -885,9 +921,8 @@ public class TwosideKeeper extends JavaPlugin implements Listener { stack.append("\n"+stacktrace[i].getClassName()+": **"+stacktrace[i].getFileName()+"** "+stacktrace[i].getMethodName()+"():"+stacktrace[i].getLineNumber()); } DiscordMessageSender.sendToSpam(stack.toString());*/ - @SuppressWarnings("unused") - Monster m = MonsterController.convertMonster((Monster)p.getWorld().spawnEntity(p.getLocation(),EntityType.WITHER), MonsterDifficulty.ELITE); - + /*Monster m = MonsterController.convertMonster((Monster)p.getWorld().spawnEntity(p.getLocation(),EntityType.ZOMBIE), MonsterDifficulty.ELITE); + m.setHealth(m.getMaxHealth()/16);*/ //GenericFunctions.sendActionBarMessage(p, "Testing/nMultiple Lines.\nLolz"); //TwosideKeeperAPI.setItemSet(p.getEquipment().getItemInMainHand(), ItemSet.PANROS); //p.getWorld().dropItemNaturally(p.getLocation(), TwosideKeeperAPI.generateMegaPiece(Material.LEATHER_CHESTPLATE, true, true, 5)); @@ -1799,6 +1834,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { public void onPlayerInteract(PlayerInteractEntityEvent ev) { log("Clicked with "+ ev.getHand().name(),5); log("Clicked on: "+ev.getRightClicked().getName(),5); + Player p = ev.getPlayer(); if (ev.getPlayer().getEquipment().getItemInMainHand().getType()==Material.NAME_TAG && (ev.getRightClicked() instanceof LivingEntity)) { //TwosideKeeper.log("Check this out.", 2); Monster m = (Monster)ev.getRightClicked(); @@ -1825,6 +1861,26 @@ public class TwosideKeeper extends JavaPlugin implements Listener { ev.setCancelled(true); } } + if (PlayerMode.getPlayerMode(p)==PlayerMode.BARBARIAN && ev.getRightClicked() instanceof LivingEntity) { + aPlugin.API.swingOffHand(p); + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + if (pd.weaponcharges>=10 && (pd.weaponcharges<30 || !p.isSneaking())) { + //Apply a stronger attack. + CustomDamage.ApplyDamage(0, p, (LivingEntity)ev.getRightClicked(), p.getInventory().getExtraContents()[0], "Power Swing"); + } else + if (pd.weaponcharges>=30 && p.isSneaking()) { + //Apply Sweep Up Attack. + pd.weaponcharges-=30; + CustomDamage.IncreaseLifestealStacks(p, pd.lifestealstacks); + GenericFunctions.sendActionBarMessage(p, ""); + //CustomDamage.ApplyDamage(0, p, (LivingEntity)ev.getRightClicked(), p.getInventory().getExtraContents()[0], "Sweep Up"); + p.playSound(p.getLocation(), Sound.ENTITY_HOSTILE_SWIM, 3.0f, 2.0f); + GenericFunctions.DealDamageToNearbyMobs(p.getLocation(), 0, 4, true, 0.9, p, p.getInventory().getExtraContents()[0], false, "Sweep Up"); + } else + { + CustomDamage.ApplyDamage(0, p, (LivingEntity)ev.getRightClicked(), p.getInventory().getExtraContents()[0], null); + } + } /*if (ev.getRightClicked() instanceof Monster) { TwosideKeeperAPI.DealDamageToEntity(TwosideKeeperAPI.getFinalDamage(500.0, ev.getPlayer(), (Monster)ev.getRightClicked(), true, "ROFL"), (Monster)ev.getRightClicked(), ev.getPlayer()); }*/ @@ -1864,11 +1920,11 @@ public class TwosideKeeper extends JavaPlugin implements Listener { //Pass along this event to Spleef Games. TwosideSpleefGames.PassEvent(ev); - final Player player = ev.getPlayer(); + final Player p = ev.getPlayer(); Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { @Override public void run() { - setPlayerMaxHealth(player); + setPlayerMaxHealth(p); } },1); if (ev.getClickedBlock()!=null && ev.getClickedBlock().getType()==Material.CHEST && @@ -1883,36 +1939,41 @@ public class TwosideKeeper extends JavaPlugin implements Listener { return; } + if ((ev.getAction()==Action.RIGHT_CLICK_AIR || ev.getAction()==Action.RIGHT_CLICK_BLOCK) && + PlayerMode.getPlayerMode(p)==PlayerMode.BARBARIAN) { + aPlugin.API.swingOffHand(p); + } + //Check for a Hunter's Compass right-click. - if ((ev.getAction()==Action.RIGHT_CLICK_AIR || ev.getAction()==Action.RIGHT_CLICK_BLOCK) && GenericFunctions.isHunterCompass(player.getEquipment().getItemInMainHand())) { - PlayerStructure pd = PlayerStructure.GetPlayerStructure(player); + if ((ev.getAction()==Action.RIGHT_CLICK_AIR || ev.getAction()==Action.RIGHT_CLICK_BLOCK) && GenericFunctions.isHunterCompass(p.getEquipment().getItemInMainHand())) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); if (pd.lastrightclick+100<=getServerTickTime()) { pd.lastrightclick=getServerTickTime(); - player.sendMessage("Calibrating "+player.getEquipment().getItemInMainHand().getItemMeta().getDisplayName()+ChatColor.WHITE+"..."); - String name = player.getEquipment().getItemInMainHand().getItemMeta().getDisplayName(); + p.sendMessage("Calibrating "+p.getEquipment().getItemInMainHand().getItemMeta().getDisplayName()+ChatColor.WHITE+"..."); + String name = p.getEquipment().getItemInMainHand().getItemMeta().getDisplayName(); if (Math.random()<=0.5) { - if (player.getEquipment().getItemInMainHand().getAmount()<=1) { - player.getEquipment().setItemInMainHand(new ItemStack(Material.AIR)); - player.playSound(player.getLocation(), Sound.BLOCK_METAL_BREAK, 1.0f, 1.0f); + if (p.getEquipment().getItemInMainHand().getAmount()<=1) { + p.getEquipment().setItemInMainHand(new ItemStack(Material.AIR)); + p.playSound(p.getLocation(), Sound.BLOCK_METAL_BREAK, 1.0f, 1.0f); } else { - player.getEquipment().getItemInMainHand().setAmount(player.getEquipment().getItemInMainHand().getAmount()-1); + p.getEquipment().getItemInMainHand().setAmount(p.getEquipment().getItemInMainHand().getAmount()-1); } Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { @Override public void run() { - player.sendMessage("The "+name+ChatColor.WHITE+" is now..."); + p.sendMessage("The "+name+ChatColor.WHITE+" is now..."); } },15); Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { @Override public void run() { - player.playSound(player.getLocation(), Sound.BLOCK_METAL_BREAK, 1.0f, 1.0f); + p.playSound(p.getLocation(), Sound.BLOCK_METAL_BREAK, 1.0f, 1.0f); } },20); Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { @Override public void run() { - player.sendMessage(ChatColor.ITALIC+" Oh my! It appears to have broke!"); + p.sendMessage(ChatColor.ITALIC+" Oh my! It appears to have broke!"); } },45); } else { @@ -1921,15 +1982,15 @@ public class TwosideKeeper extends JavaPlugin implements Listener { if (Math.random()<=0.5) { TwosideKeeper.ELITE_LOCATION = elitemonsters.get(i).m.getLocation(); pointToExistingElite=true; - player.sendMessage("The "+name+ChatColor.WHITE+" is now properly calibrated!"); - player.sendMessage(ChatColor.ITALIC+" Good luck on your adventure!"); - player.setCompassTarget(TwosideKeeper.ELITE_LOCATION); + p.sendMessage("The "+name+ChatColor.WHITE+" is now properly calibrated!"); + p.sendMessage(ChatColor.ITALIC+" Good luck on your adventure!"); + p.setCompassTarget(TwosideKeeper.ELITE_LOCATION); break; } } if (!pointToExistingElite) { pd.lastcompassnotification=getServerTickTime(); - GenericFunctions.generateNewElite(player,name); + GenericFunctions.generateNewElite(p,name); } } ev.setCancelled(true); @@ -1941,29 +2002,30 @@ public class TwosideKeeper extends JavaPlugin implements Listener { if (ev.getAction()==Action.RIGHT_CLICK_AIR || ev.getAction()==Action.RIGHT_CLICK_BLOCK || ev.getAction()==Action.LEFT_CLICK_BLOCK || ev.getAction()==Action.LEFT_CLICK_AIR) { - Player p = ev.getPlayer(); if (PlayerMode.isRanger(p) && p.isSneaking() && p.getEquipment().getItemInMainHand().getType()==Material.BOW) { //Rotate Bow Modes. GenericFunctions.logAndRemovePotionEffectFromEntity(PotionEffectType.SLOW,p); BowMode mode = GenericFunctions.getBowMode(p.getEquipment().getItemInMainHand()); - + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); if (ev.getAction().name().contains("RIGHT")) { switch (mode) { case CLOSE:{ p.playSound(p.getLocation(), Sound.ENTITY_ZOMBIE_INFECT, 0.5f, 0.1f); GenericFunctions.setBowMode(p.getEquipment().getItemInMainHand(),BowMode.SNIPE); + aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), GenericFunctions.GetRemainingCooldownTime(p, pd.last_arrowbarrage, ARROWBARRAGE_COOLDOWN)); }break; case SNIPE:{ p.playSound(p.getLocation(), Sound.BLOCK_BREWING_STAND_BREW, 0.5f, 0.1f); GenericFunctions.setBowMode(p.getEquipment().getItemInMainHand(),BowMode.DEBILITATION); + aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), GenericFunctions.GetRemainingCooldownTime(p, pd.last_siphon, SIPHON_COOLDOWN)); }break; case DEBILITATION:{ p.playSound(p.getLocation(), Sound.BLOCK_CHEST_LOCKED, 0.5f, 3.5f); GenericFunctions.setBowMode(p.getEquipment().getItemInMainHand(),BowMode.CLOSE); + aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), GenericFunctions.GetRemainingCooldownTime(p, pd.last_dodge, DODGE_COOLDOWN)); }break; } } else { - PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); if (pd.lastbowmodeswitch+6>=getServerTickTime()) { return; } @@ -1971,14 +2033,17 @@ public class TwosideKeeper extends JavaPlugin implements Listener { case CLOSE:{ p.playSound(p.getLocation(), Sound.BLOCK_BREWING_STAND_BREW, 0.5f, 0.1f); GenericFunctions.setBowMode(p.getEquipment().getItemInMainHand(),BowMode.DEBILITATION); + aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), GenericFunctions.GetRemainingCooldownTime(p, pd.last_siphon, SIPHON_COOLDOWN)); }break; case SNIPE:{ p.playSound(p.getLocation(), Sound.BLOCK_CHEST_LOCKED, 0.5f, 3.5f); GenericFunctions.setBowMode(p.getEquipment().getItemInMainHand(),BowMode.CLOSE); + aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), GenericFunctions.GetRemainingCooldownTime(p, pd.last_dodge, DODGE_COOLDOWN)); }break; case DEBILITATION:{ p.playSound(p.getLocation(), Sound.ENTITY_ZOMBIE_INFECT, 0.5f, 0.1f); GenericFunctions.setBowMode(p.getEquipment().getItemInMainHand(),BowMode.SNIPE); + aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), GenericFunctions.GetRemainingCooldownTime(p, pd.last_arrowbarrage, ARROWBARRAGE_COOLDOWN)); }break; } pd.lastbowmodeswitch=getServerTickTime(); @@ -1992,7 +2057,6 @@ public class TwosideKeeper extends JavaPlugin implements Listener { //Check for a Sword left click. if (ev.getAction()==Action.LEFT_CLICK_AIR || ev.getAction()==Action.LEFT_CLICK_BLOCK) { - Player p = ev.getPlayer(); if (PlayerMode.isStriker(p)) { //Check for nearby arrows to deflect. List nearby = p.getNearbyEntities(3.5, 3.5, 3.5); @@ -2022,9 +2086,9 @@ public class TwosideKeeper extends JavaPlugin implements Listener { //Check for a Scythe right click here. if ((ev.getAction()==Action.RIGHT_CLICK_AIR || ev.getAction()==Action.RIGHT_CLICK_BLOCK) && - GenericFunctions.isArtifactEquip(player.getEquipment().getItemInMainHand())) { + GenericFunctions.isArtifactEquip(p.getEquipment().getItemInMainHand())) { boolean bursted=false; - bursted = performDeathMark(player, bursted); + bursted = performDeathMark(p, bursted); if (bursted) { //Cancel this then, because we decided to burst our stacks instead. ev.setCancelled(true); @@ -2065,25 +2129,25 @@ public class TwosideKeeper extends JavaPlugin implements Listener { Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { @Override public void run() { - if (player.isBlocking()) { + if (p.isBlocking()) { //Give absorption hearts. - if (PlayerMode.isDefender(player)) { - GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.ABSORPTION,200,1,player); - List entities = player.getNearbyEntities(16, 16, 16); + if (PlayerMode.isDefender(p)) { + GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.ABSORPTION,200,1,p); + List entities = p.getNearbyEntities(16, 16, 16); for (int i=0;i(), cubetype); ITEMCUBEID++; } + return; } } } @@ -2991,6 +3069,73 @@ public class TwosideKeeper extends JavaPlugin implements Listener { pd.lastsprintcheck=getServerTickTime(); } } + + @SuppressWarnings("deprecation") + @EventHandler(priority=EventPriority.LOW,ignoreCancelled = true) + public void onPlayerSwapItem(PlayerSwapHandItemsEvent ev) { + Player p = ev.getPlayer(); + if (ArrowQuiver.isValidQuiver(ev.getMainHandItem())) { + ev.setCancelled(true); + //Swap forward or backward modes, depending on whether we are sneaking of not. + ItemStack quiver = p.getEquipment().getItemInOffHand(); + int mode = ArrowQuiver.getArrowQuiverMode(quiver); + if (p.isSneaking()) { + if (mode==0) { + mode=ArrowQuiver.getContents(ArrowQuiver.getID(quiver)).size()-1; + } else { + mode-=1; + } + } else { + if(ArrowQuiver.getContents(ArrowQuiver.getID(quiver)).size()>mode+1) { + mode++; + } else { + mode=0; + } + } + ArrowQuiver.setArrowQuiverMode(quiver, mode); + ArrowQuiver.updateQuiverLore(quiver); + List contents = ArrowQuiver.getContents(ArrowQuiver.getID(quiver)); + if (contents.size()>0) { + String message = ChatColor.DARK_GRAY+"Now Firing "+ChatColor.YELLOW+GenericFunctions.UserFriendlyMaterialName(contents.get(mode))+ChatColor.GRAY+" ["+contents.get(mode).getAmount()+"]"; + GenericFunctions.sendActionBarMessage(p, message, true); + } else { + String message = ChatColor.RED+"Quiver is empty!"; + GenericFunctions.sendActionBarMessage(p, message, true); + } + return; + } + if (PlayerMode.getPlayerMode(p)==PlayerMode.BARBARIAN) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + if (pd.weaponcharges>=100) { + //Perform Barbarian's Rage! + p.playSound(p.getLocation(), Sound.ENTITY_GHAST_DEATH, 1.0f, 0.3f); + int rage_duration = (20*(pd.weaponcharges/10)); + pd.rage_time=getServerTickTime() + rage_duration; + pd.rage_amt=pd.weaponcharges; + int str_lv = (pd.weaponcharges/10)-1; + if (p.hasPotionEffect(PotionEffectType.INCREASE_DAMAGE)) { + if (GenericFunctions.getPotionEffectLevel(PotionEffectType.INCREASE_DAMAGE, p) le = GenericFunctions.getNearbyMobs(p.getLocation(), 12); + for (LivingEntity ent : le) { + if (!(ent instanceof Player)) { + if (ent instanceof Monster) { + CustomDamage.provokeMonster((Monster)ent, p, ev.getItemDrop().getItemStack()); + CustomDamage.setAggroGlowTickTime((Monster)ent, 20*15); + GenericFunctions.addStackingPotionEffect(ent, PotionEffectType.WEAKNESS, 20*15, 5, 2); + } + } + } + p.playSound(p.getLocation(), Sound.ENTITY_VILLAGER_AMBIENT, 1.0f, 0.3f); + aPlugin.API.displayEndRodParticle(p.getLocation(), 0, 0f, 0f, 5, 20); + if (hasFullSet) { + aPlugin.API.sendCooldownPacket(p, ev.getItemDrop().getItemStack().getType(), GenericFunctions.GetModifiedCooldown(TwosideKeeper.MOCK_COOLDOWN/2,ev.getPlayer())); + } else { + aPlugin.API.sendCooldownPacket(p, ev.getItemDrop().getItemStack().getType(), GenericFunctions.GetModifiedCooldown(TwosideKeeper.MOCK_COOLDOWN,ev.getPlayer())); + } + } + ev.getPlayer().getEquipment().setItemInMainHand(new ItemStack(Material.AIR)); + } + return; + } + if (ev.getItemDrop().getItemStack().getType()==Material.BOW && !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()); GenericFunctions.PerformDodge(ev.getPlayer()); + GenericFunctions.PerformArrowBarrage(ev.getPlayer()); + GenericFunctions.PerformSiphon(ev.getPlayer()); ev.getPlayer().getEquipment().setItemInMainHand(new ItemStack(Material.AIR)); } return; @@ -3317,6 +3497,18 @@ public class TwosideKeeper extends JavaPlugin implements Listener { } },1); } + + if ((ev.getClick()==ClickType.SHIFT_LEFT || ev.getClick()==ClickType.SHIFT_RIGHT) && + ev.getWhoClicked().getInventory().getExtraContents()[0]==null && GenericFunctions.AllowedToBeEquippedToOffHand((Player)ev.getWhoClicked(),ev.getCurrentItem(),ev.getRawSlot()) && + ((ev.getInventory().getType()!=InventoryType.WORKBENCH && ev.getRawSlot()>=0) || + (ev.getInventory().getType()==InventoryType.WORKBENCH && ev.getRawSlot()>9))) { + //Move the item into that slot instead. + ev.getWhoClicked().getEquipment().setItemInOffHand(ev.getCurrentItem().clone()); + ev.setCurrentItem(new ItemStack(Material.AIR)); + ev.setResult(Result.DENY); + ev.setCancelled(true); + return; + } if (DeathManager.deathStructureExists(player) && ev.getInventory().getTitle().equalsIgnoreCase("Death Loot")) { //See how many items are in our inventory. Determine final balance. @@ -3348,8 +3540,46 @@ public class TwosideKeeper extends JavaPlugin implements Listener { ev.setCancelled(true); return; } + + //Left-Click for an Arrow Quiver. + if (ev.getClick()==ClickType.LEFT && ev.getCursor()!=null && ev.getCursor().getAmount()>0 && + GenericFunctions.isValidArrow(ev.getCursor()) && + ArrowQuiver.isValidQuiver(ev.getCurrentItem()) && + ((ev.getInventory().getType()!=InventoryType.WORKBENCH && ev.getRawSlot()>=0) || + (ev.getInventory().getType()==InventoryType.WORKBENCH && ev.getRawSlot()>9))) { + //Insert the item into there. + ArrowQuiver.addContents(ev.getCurrentItem(), ev.getCursor()); + ArrowQuiver.updateQuiverLore(ev.getCurrentItem()); + ev.setCursor(new ItemStack(Material.AIR)); + //Cancel this click event. + ev.setCancelled(true); + ev.setResult(Result.DENY); + return; + } + + //Right-Click for an Arrow Quiver. + if (ev.getClick()==ClickType.RIGHT && (ev.getCursor()==null || ev.getCursor().getType()==Material.AIR) && ev.getCursor().getAmount()==0 && + ArrowQuiver.isValidQuiver(ev.getCurrentItem()) && + ((ev.getInventory().getType()!=InventoryType.WORKBENCH && ev.getRawSlot()>=0) || + (ev.getInventory().getType()==InventoryType.WORKBENCH && ev.getRawSlot()>9))) { + //Try to pull out items from the Quiver from the current mode. + List contents = ArrowQuiver.getContents(ArrowQuiver.getID(ev.getCurrentItem())); + if (contents.size()>0) { + ItemStack modeitems = contents.get(ArrowQuiver.getArrowQuiverMode(ev.getCurrentItem())).clone(); + if (modeitems.getAmount()>64) { + modeitems.setAmount(64); + } + ArrowQuiver.removeContents(ev.getCurrentItem(), modeitems); + ArrowQuiver.updateQuiverLore(ev.getCurrentItem()); + ev.setCursor(modeitems); + } + ev.setCancelled(true); + ev.setResult(Result.DENY); + return; + } + //Check for a left click for an arrow quiver. - if (ev.getClick()==ClickType.LEFT) { + /*if (ev.getClick()==ClickType.LEFT) { //LEGACY CODE. //Tries to take out 1 stack of arrows. //We're going to try to deposit arrows. if (ev.getCursor()!=null && ev.getCursor().getAmount()>0 && @@ -3413,7 +3643,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { return; } } - } + }*/ if (ev.getInventory().getTitle().contains("Item Cube #") && ev.getRawSlot()==-999) { @@ -3817,6 +4047,22 @@ public class TwosideKeeper extends JavaPlugin implements Listener { return; //This spawn was not allowed by the mob height controller. } + if (ev.getEntity() instanceof Skeleton) { + Skeleton sk = (Skeleton)ev.getEntity(); + if (sk.getSkeletonType()==SkeletonType.WITHER) { + if (Math.random()<=0.8) { + if (Math.random()<=0.6) { + MonsterController.convertMonster(sk, MonsterDifficulty.HELLFIRE); + } else { + MonsterController.convertMonster(sk, MonsterDifficulty.DEADLY); + } + } else { + if (Math.random()<=0.5) { + MonsterController.convertMonster(sk, MonsterDifficulty.DANGEROUS); + } + } + } + } } } else { log("Reason for spawn: "+ev.getSpawnReason().toString(),4); @@ -3901,13 +4147,13 @@ public class TwosideKeeper extends JavaPlugin implements Listener { @EventHandler(priority=EventPriority.LOW,ignoreCancelled = true) public void updateHealthbarDamageEvent(EntityDamageEvent ev) { + if (ev.getEntity().isDead()) {ev.setCancelled(true); return;} if (ev.getCause()!=DamageCause.ENTITY_ATTACK && ev.getCause()!=DamageCause.PROJECTILE && ev.getCause()!=DamageCause.ENTITY_EXPLOSION && ev.getCause()!=DamageCause.THORNS && ev.getCause()!=DamageCause.MAGIC) { //We handle the event inside of here. DealDamage(ev.getDamage(DamageModifier.BASE)); - if (ev.getCause()==DamageCause.BLOCK_EXPLOSION) { ev.setDamage(DamageModifier.BASE,0); ev.setCancelled(true); @@ -3920,10 +4166,17 @@ public class TwosideKeeper extends JavaPlugin implements Listener { double dmgdealt = ev.getDamage(DamageModifier.BASE); CustomDamage.setupTrueDamage(ev); //boolean applieddmg = CustomDamage.ApplyDamage(dmgdealt, null, (LivingEntity)ev.getEntity(), null, ev.getCause().name(), CustomDamage.TRUEDMG); - if (!CustomDamage.InvulnerableCheck(null, (LivingEntity)ev.getEntity())) { + if (!CustomDamage.InvulnerableCheck(null, (LivingEntity)ev.getEntity(),ev.getCause().name(), CustomDamage.TRUEDMG)) { boolean applieddmg=true; dmgdealt = CustomDamage.CalculateDamage(dmgdealt, null, (LivingEntity)ev.getEntity(), null, ev.getCause().name(), CustomDamage.TRUEDMG); if (ev.getCause()==DamageCause.FALL) { + if (ev.getEntity() instanceof Player) { + Player p = (Player)ev.getEntity(); + if (PlayerMode.getPlayerMode(p)==PlayerMode.BARBARIAN) { + createFallShockwave(p,dmgdealt); + GenericFunctions.DealDamageToNearbyMobs(p.getLocation(), dmgdealt*3, Math.min(16,dmgdealt), true, Math.min(2.0,dmgdealt/8), p, p.getEquipment().getItemInMainHand(), false, "Leaping Strike"); + } + } dmgdealt *= GenericFunctions.CalculateFallResistance((LivingEntity)ev.getEntity()); } dmgdealt = CustomDamage.subtractAbsorptionHearts(dmgdealt, (LivingEntity)ev.getEntity()); @@ -3965,6 +4218,15 @@ public class TwosideKeeper extends JavaPlugin implements Listener { } } + private void createFallShockwave(Player p, double dmgdealt) { + AreaEffectCloud aec = (AreaEffectCloud)p.getWorld().spawnEntity(p.getLocation(), EntityType.AREA_EFFECT_CLOUD); + //PARTICLE.BARRIER looks pretty good. + aec.setDuration(20); + aec.setParticle(Particle.DRIP_LAVA); + aec.setRadius(Math.min(16,(float)dmgdealt)); + aec.setColor(Color.RED); + } + private void damageArmor(Player p, int i) { ItemStack[] armorset = p.getEquipment().getArmorContents(); for (int j=0;j=CUSTOM_DAMAGE_IDENTIFIER) { - log("BASE damage: "+ev.getDamage(DamageModifier.BASE)+"-"+CUSTOM_DAMAGE_IDENTIFIER,5); - double dmgdealt = ev.getDamage(DamageModifier.BASE)-CUSTOM_DAMAGE_IDENTIFIER; - CustomDamage.setupTrueDamage(ev); - ev.setDamage(DamageModifier.BASE, dmgdealt); - log("BASE damage: "+ev.getDamage(DamageModifier.BASE),5); - //Only a player can deal custom damage. - LivingEntity l = CustomDamage.getDamagerEntity(ev.getDamager()); - if (l instanceof Player) { - Player shooter = (Player)l; - PlayerStructure pd = PlayerStructure.GetPlayerStructure(shooter); - int flags = pd.lasthitproperties; - pd.target=(LivingEntity)ev.getEntity(); - pd.damagedealt=dmgdealt; - displayTitle(shooter,pd,flags); - } - } else { - ItemStack weapon = null; - if (CustomDamage.getDamagerEntity(ev.getDamager()) instanceof Player) { - weapon = ((Player)(CustomDamage.getDamagerEntity(ev.getDamager()))).getEquipment().getItemInMainHand(); - } - - if (CustomDamage.getDamagerEntity(ev.getDamager()) instanceof Player) { - Player p = (Player)CustomDamage.getDamagerEntity(ev.getDamager()); - PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); - if (PlayerMode.isDefender(p) && p.isSneaking() && ItemSet.HasSetBonusBasedOnSetBonusCount(GenericFunctions.getEquipment(p), p, ItemSet.SONGSTEEL,5) && pd.vendetta_amt>0.0) { //Deal Vendetta damage instead. - p.playSound(p.getLocation(), Sound.BLOCK_GLASS_BREAK, 1.0f, 0.5f); - GenericFunctions.removeNoDamageTick((LivingEntity)ev.getEntity(), ev.getDamager()); - CustomDamage.ApplyDamage(pd.vendetta_amt, ev.getDamager(), (LivingEntity)ev.getEntity(), null, "Vendetta"); - pd.vendetta_amt=0.0; - GenericFunctions.sendActionBarMessage(p, ChatColor.YELLOW+"Vendetta: "+ChatColor.GREEN+Math.round(pd.vendetta_amt)+" dmg stored",true); - } else { - CustomDamage.ApplyDamage(0, ev.getDamager(), (LivingEntity)ev.getEntity(), weapon, null); - if (ev.getDamager() instanceof Projectile) { - Projectile proj = (Projectile)ev.getDamager(); - proj.remove(); - } - ev.setCancelled(true); + { + if (ev.getDamage(DamageModifier.BASE)>=CUSTOM_DAMAGE_IDENTIFIER) { + log("BASE damage: "+ev.getDamage(DamageModifier.BASE)+"-"+CUSTOM_DAMAGE_IDENTIFIER,5); + double dmgdealt = ev.getDamage(DamageModifier.BASE)-CUSTOM_DAMAGE_IDENTIFIER; + CustomDamage.setupTrueDamage(ev); + ev.setDamage(DamageModifier.BASE, dmgdealt); + log("BASE damage: "+ev.getDamage(DamageModifier.BASE),5); + //Only a player can deal custom damage. + LivingEntity l = CustomDamage.getDamagerEntity(ev.getDamager()); + if (l instanceof Player) { + Player shooter = (Player)l; + PlayerStructure pd = PlayerStructure.GetPlayerStructure(shooter); + int flags = pd.lasthitproperties; + pd.target=(LivingEntity)ev.getEntity(); + pd.damagedealt=dmgdealt; + displayTitle(shooter,pd,flags); } - //Handle this manually if it's a player. } else { - if (ev.getEntity() instanceof Player) { //Check for custom trigger events for elites first. - Player p = (Player)ev.getEntity(); - CustomDamage.triggerEliteEvent(p,ev.getDamager()); + ItemStack weapon = null; + if (CustomDamage.getDamagerEntity(ev.getDamager()) instanceof Player) { + weapon = ((Player)(CustomDamage.getDamagerEntity(ev.getDamager()))).getEquipment().getItemInMainHand(); } - if (!CustomDamage.InvulnerableCheck(ev.getDamager(), (LivingEntity)ev.getEntity())) { - double dmgdealt = CustomDamage.CalculateDamage(0, ev.getDamager(), (LivingEntity)ev.getEntity(), null, null, CustomDamage.NONE); - dmgdealt = CustomDamage.subtractAbsorptionHearts(dmgdealt, (LivingEntity)ev.getEntity()); - dmgdealt = CustomDamage.applyOnHitEffects(dmgdealt,ev.getDamager(),(LivingEntity)ev.getEntity(),weapon,null,CustomDamage.NONE); - if (ev.getDamager()!=null) { - TwosideKeeper.logHealth((LivingEntity)ev.getEntity(),((LivingEntity)ev.getEntity()).getHealth(),dmgdealt,ev.getDamager()); + + if (CustomDamage.getDamagerEntity(ev.getDamager()) instanceof Player) { + Player p = (Player)CustomDamage.getDamagerEntity(ev.getDamager()); + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + if (PlayerMode.isDefender(p) && p.isSneaking() && ItemSet.HasSetBonusBasedOnSetBonusCount(GenericFunctions.getEquipment(p), p, ItemSet.SONGSTEEL,5) && pd.vendetta_amt>0.0) { //Deal Vendetta damage instead. + p.playSound(p.getLocation(), Sound.BLOCK_GLASS_BREAK, 1.0f, 0.5f); + GenericFunctions.removeNoDamageTick((LivingEntity)ev.getEntity(), ev.getDamager()); + CustomDamage.ApplyDamage(pd.vendetta_amt, ev.getDamager(), (LivingEntity)ev.getEntity(), null, "Vendetta"); + pd.vendetta_amt=0.0; + GenericFunctions.sendActionBarMessage(p, ChatColor.YELLOW+"Vendetta: "+ChatColor.GREEN+Math.round(pd.vendetta_amt)+" dmg stored",true); + } else { + CustomDamage.ApplyDamage(0, ev.getDamager(), (LivingEntity)ev.getEntity(), weapon, null); + if (ev.getDamager() instanceof Projectile) { + Projectile proj = (Projectile)ev.getDamager(); + proj.remove(); + } + ev.setCancelled(true); } - CustomDamage.setupTrueDamage(ev); - ev.setDamage(DamageModifier.BASE, dmgdealt); - if (dmgdealt < 1) { - ev.setDamage(DamageModifier.BASE,dmgdealt); - } else { - ev.setDamage(DamageModifier.BASE,1d); - ((LivingEntity)ev.getEntity()).setHealth(Math.max(((LivingEntity)ev.getEntity()).getHealth() - (dmgdealt - 1d), 0.5)); - } + //Handle this manually if it's a player. } else { - ev.setCancelled(true); + if (ev.getEntity() instanceof Player) { //Check for custom trigger events for elites first. + Player p = (Player)ev.getEntity(); + CustomDamage.triggerEliteEvent(p,ev.getDamager()); + } + if (!CustomDamage.InvulnerableCheck(ev.getDamager(), (LivingEntity)ev.getEntity())) { + double dmgdealt = CustomDamage.CalculateDamage(0, ev.getDamager(), (LivingEntity)ev.getEntity(), null, null, CustomDamage.NONE); + dmgdealt = CustomDamage.subtractAbsorptionHearts(dmgdealt, (LivingEntity)ev.getEntity()); + dmgdealt = CustomDamage.applyOnHitEffects(dmgdealt,ev.getDamager(),(LivingEntity)ev.getEntity(),weapon,null,CustomDamage.NONE); + if (ev.getDamager()!=null) { + TwosideKeeper.logHealth((LivingEntity)ev.getEntity(),((LivingEntity)ev.getEntity()).getHealth(),dmgdealt,ev.getDamager()); + } + CustomDamage.setupTrueDamage(ev); + ev.setDamage(DamageModifier.BASE, dmgdealt); + if (dmgdealt < 1) { + ev.setDamage(DamageModifier.BASE,dmgdealt); + } else { + ev.setDamage(DamageModifier.BASE,1d); + ((LivingEntity)ev.getEntity()).setHealth(Math.max(((LivingEntity)ev.getEntity()).getHealth() - (dmgdealt - 1d), 0.5)); + } + } else { + ev.setCancelled(true); + } } } } @@ -4208,18 +4473,43 @@ public class TwosideKeeper extends JavaPlugin implements Listener { @EventHandler(priority=EventPriority.LOW,ignoreCancelled = true) public void expEvent(PlayerExpChangeEvent ev) { - double val = Math.random(); + double val = Math.random(); + Player p = ev.getPlayer(); log("ExpChange event: "+val,5); int amt = ev.getAmount(); int testamt = amt; if (amt>500) { testamt=500; } + ev.setAmount((int)(ev.getAmount()+(ev.getAmount()*(ItemSet.GetTotalBaseAmount(GenericFunctions.getHotbarItems(ev.getPlayer()), ev.getPlayer(), ItemSet.ALUSTINE)/100d)))); + + if (ItemSet.HasSetBonusBasedOnSetBonusCount(GenericFunctions.getHotbarItems(p), p, ItemSet.ALUSTINE, 5)) { + if (Math.random()<=Math.min((ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getHotbarItems(p), p, ItemSet.ALUSTINE, 5, 4)/20d),1)) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + if (PlayerMode.getPlayerMode(p)==PlayerMode.SLAYER) { + if (pd.slayermodehp+20) { + pd.damagepool/=4; + GenericFunctions.sendActionBarMessage(p, ""); + } + } if (isRanger) { switch (GenericFunctions.getBowMode(p.getEquipment().getItemInMainHand())) { case CLOSE:{ @@ -4722,6 +5022,8 @@ public class TwosideKeeper extends JavaPlugin implements Listener { pd.lastdeath=getServerTickTime(); pd.hasDied=false; pd.slayermodehp=10; + pd.damagepool=0; + pd.weaponcharges=0; //log("Block started on is "+ev.getRespawnLocation().getBlock(),2); //p.teleport(GenericFunctions.FindRandomFreeLocation(p.getLocation().add(0,1,0))); Location newloc = ev.getRespawnLocation(); @@ -4999,32 +5301,64 @@ public class TwosideKeeper extends JavaPlugin implements Listener { @EventHandler(priority=EventPriority.LOWEST,ignoreCancelled = true) public void onArrowPickup(PlayerPickupArrowEvent ev) { - if (ev.getArrow() instanceof TippedArrow) { - TippedArrow a = (TippedArrow)ev.getArrow(); + if (ev.getArrow() instanceof Arrow) { + Arrow a = (Arrow)ev.getArrow(); + Player p = ev.getPlayer(); ItemStack item = ev.getItem().getItemStack(); - boolean specialarrow=false; - if (a.hasMetadata("EXPLODE_ARR")) {item=Recipes.getArrowFromMeta("EXPLODE_ARR"); specialarrow=true;} else - if (a.hasMetadata("TRAP_ARR")) {item=Recipes.getArrowFromMeta("TRAP_ARR"); specialarrow=true;} else - if (a.hasMetadata("POISON_ARR")) {item=Recipes.getArrowFromMeta("POISON_ARR"); specialarrow=true;} else - if (a.hasMetadata("QUADRUPLE_DAMAGE_ARR")) {item=Recipes.getArrowFromMeta("QUADRUPLE_DAMAGE_ARR"); specialarrow=true;} else - if (a.hasMetadata("DOUBLE_DAMAGE_ARR")) {item=Recipes.getArrowFromMeta("DOUBLE_DAMAGE_ARR"); specialarrow=true;} - if (specialarrow) { - ev.getItem().remove(); - ev.getPlayer().playSound(ev.getPlayer().getLocation(), Sound.ENTITY_ITEM_PICKUP, 1.0f, 1.0f); - ev.setCancelled(true); - ev.getPlayer().getInventory().addItem(item); - //ev.getItem().setItemStack(item); - } + if (ev.getArrow().hasMetadata("INFINITEARROW")) { //Not allowed to be picked up, this was an infinite arrow. + TwosideKeeper.log("INFINITE PICKUP ARROW", 5); + ev.setCancelled(true); + return; + } else { + boolean specialarrow=false; + if (a.hasMetadata("EXPLODE_ARR")) {item=Recipes.getArrowFromMeta("EXPLODE_ARR"); specialarrow=true;} else + if (a.hasMetadata("TRAP_ARR")) {item=Recipes.getArrowFromMeta("TRAP_ARR"); specialarrow=true;} else + if (a.hasMetadata("PIERCING_ARR")) {item=Recipes.getArrowFromMeta("PIERCING_ARR"); specialarrow=true;} else + if (a.hasMetadata("POISON_ARR")) {item=Recipes.getArrowFromMeta("POISON_ARR"); specialarrow=true;} else + if (a.hasMetadata("QUADRUPLE_DAMAGE_ARR")) {item=Recipes.getArrowFromMeta("QUADRUPLE_DAMAGE_ARR"); specialarrow=true;} else + if (a.hasMetadata("DOUBLE_DAMAGE_ARR")) {item=Recipes.getArrowFromMeta("DOUBLE_DAMAGE_ARR"); specialarrow=true;} + if (specialarrow) { + ev.getItem().remove(); + ev.getPlayer().playSound(ev.getPlayer().getLocation(), Sound.ENTITY_ITEM_PICKUP, 1.0f, 1.0f); + ev.setCancelled(true); + AddToPlayerInventory(item, p); + //ev.getItem().setItemStack(item); + return; + } + ItemStack collect = CustomItem.convertArrowEntityFromMeta(ev.getArrow()); + if (collect!=null) { + ev.getItem().remove(); + ev.getPlayer().playSound(ev.getPlayer().getLocation(), Sound.ENTITY_ITEM_PICKUP, 1.0f, 1.0f); + AddToPlayerInventory(collect, p); + ev.setCancelled(true); + return; + } + } } } - @EventHandler(priority=EventPriority.LOW,ignoreCancelled = true) + public void AddToPlayerInventory(ItemStack item, Player p) { + ItemStack arrowquiver = ArrowQuiver.getArrowQuiverInPlayerInventory(p); + if (arrowquiver==null) { + attemptToStackInInventory(p,item); + } else { + ArrowQuiver.addContents(arrowquiver, item); + ArrowQuiver.updateQuiverLore(arrowquiver); + } + } + + private void attemptToStackInInventory(Player p, ItemStack collect) { + GenericFunctions.giveItem(p, collect); + } + + @EventHandler(priority=EventPriority.LOW,ignoreCancelled = true) public void onItemPickup(PlayerPickupItemEvent ev) { //Arrow quiver code goes here. log("Pickup Metadata: "+ev.getItem().getItemStack().getItemMeta().toString(),5); Player p = ev.getPlayer(); //GenericFunctions.updateSetItems(p.getInventory()); GenericFunctions.UpdateItemLore(ev.getItem().getItemStack()); + /*//LEGACY CODE if (!ev.isCancelled()) { if (ev.getItem().getItemStack().getType()==Material.ARROW && playerHasArrowQuiver(p)) { @@ -5037,20 +5371,57 @@ public class TwosideKeeper extends JavaPlugin implements Listener { ev.getItem().remove(); ev.setCancelled(true); } - } + }*/ boolean handled = AutoEquipItem(ev.getItem().getItemStack(), p); if (handled) { ev.getItem().remove(); ev.setCancelled(handled); + return; + } + + if (AutoConsumeItem(p,ev.getItem().getItemStack())) { + ev.getPlayer().playSound(ev.getPlayer().getLocation(), Sound.ENTITY_GENERIC_EAT, 1.0f, 1.0f); + ev.getItem().remove(); + ev.setCancelled(true); + return; + } + + if (ev.getItem().hasMetadata("INFINITEARROW")) { //Not allowed to be picked up, this was an infinite arrow. + TwosideKeeper.log("INFINITE PICKUP", 5); + ev.setCancelled(true); + return; + } + + if (GenericFunctions.isValidArrow(ev.getItem().getItemStack())) { + ev.setCancelled(true); + ev.getItem().remove(); + ev.getPlayer().playSound(ev.getPlayer().getLocation(), Sound.ENTITY_ITEM_PICKUP, 1.0f, 1.0f); + AddToPlayerInventory(ev.getItem().getItemStack(), p); } } + private boolean AutoConsumeItem(Player p, ItemStack item) { + if (PlayerMode.getPlayerMode(p)==PlayerMode.BARBARIAN) { + if (GenericFunctions.isAutoConsumeFood(item)) { + //Consume them here. + double basepercent = p.getMaxHealth()*0.01; + double healamt = basepercent*item.getAmount(); + GenericFunctions.HealEntity(p,healamt); + p.setFoodLevel(Math.min(20, p.getFoodLevel()+item.getAmount())); + return true; + } + } + return false; + } + public boolean AutoEquipItem(ItemStack item, Player p) { if (item.getType().toString().contains("BOOTS") || item.getType().toString().contains("LEGGINGS") || item.getType().toString().contains("CHESTPLATE") || item.getType().toString().contains("HELMET") || - item.getType().toString().contains("SHIELD")) { + item.getType().toString().contains("SHIELD") || + item.getType().toString().contains("TIPPED_ARROW") || + item.getType().toString().contains("_AXE")) { ItemStack armor = item; //See if this armor type is not being worn by the player. if (armor.getType().toString().contains("BOOTS") && @@ -5061,6 +5432,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { p.sendMessage(ChatColor.DARK_AQUA+"Automatically equipped "+ChatColor.YELLOW+(item.getItemMeta().hasDisplayName()?item.getItemMeta().getDisplayName():GenericFunctions.UserFriendlyMaterialName(item))); p.playSound(p.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1.0f, 1.0f); GenericFunctions.playProperEquipSound(p,armor.getType()); + p.updateInventory(); return true; } else if (armor.getType().toString().contains("LEGGINGS") && @@ -5071,6 +5443,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { p.sendMessage(ChatColor.DARK_AQUA+"Automatically equipped "+ChatColor.YELLOW+(item.getItemMeta().hasDisplayName()?item.getItemMeta().getDisplayName():GenericFunctions.UserFriendlyMaterialName(item))); p.playSound(p.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1.0f, 1.0f); GenericFunctions.playProperEquipSound(p,armor.getType()); + p.updateInventory(); return true; } else if (armor.getType().toString().contains("CHESTPLATE") && @@ -5081,6 +5454,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { p.sendMessage(ChatColor.DARK_AQUA+"Automatically equipped "+ChatColor.YELLOW+(item.getItemMeta().hasDisplayName()?item.getItemMeta().getDisplayName():GenericFunctions.UserFriendlyMaterialName(item))); p.playSound(p.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1.0f, 1.0f); GenericFunctions.playProperEquipSound(p,armor.getType()); + p.updateInventory(); return true; } else if (armor.getType().toString().contains("HELMET") && @@ -5091,16 +5465,43 @@ public class TwosideKeeper extends JavaPlugin implements Listener { p.sendMessage(ChatColor.DARK_AQUA+"Automatically equipped "+ChatColor.YELLOW+(item.getItemMeta().hasDisplayName()?item.getItemMeta().getDisplayName():GenericFunctions.UserFriendlyMaterialName(item))); p.playSound(p.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1.0f, 1.0f); GenericFunctions.playProperEquipSound(p,armor.getType()); + p.updateInventory(); return true; } else if (armor.getType().toString().contains("SHIELD") && - p.getInventory().getExtraContents()[0]==null && + (p.getEquipment().getItemInMainHand().getType()==Material.AIR || p.getInventory().getExtraContents()[0]==null) && !PlayerMode.isStriker(p) && (!PlayerMode.isRanger(p) || (armor.getType().toString().contains("LEATHER")))) { + if (p.getEquipment().getItemInMainHand().getType()==Material.AIR) { + p.getEquipment().setItemInMainHand(armor); + } else { + p.getInventory().setExtraContents(new ItemStack[]{armor}); + } + p.sendMessage(ChatColor.DARK_AQUA+"Automatically equipped "+ChatColor.YELLOW+(item.getItemMeta().hasDisplayName()?item.getItemMeta().getDisplayName():GenericFunctions.UserFriendlyMaterialName(item))); + p.playSound(p.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1.0f, 1.0f); + GenericFunctions.playProperEquipSound(p,armor.getType()); + p.updateInventory(); + return true; + } else + if (armor.getType().toString().contains("_AXE") && + (p.getEquipment().getItemInMainHand().getType()==Material.AIR || p.getInventory().getExtraContents()[0]==null)) { + if (p.getEquipment().getItemInMainHand().getType()==Material.AIR) { + p.getEquipment().setItemInMainHand(armor); + } else { + p.getInventory().setExtraContents(new ItemStack[]{armor}); + } + p.sendMessage(ChatColor.DARK_AQUA+"Automatically equipped "+ChatColor.YELLOW+(item.getItemMeta().hasDisplayName()?item.getItemMeta().getDisplayName():GenericFunctions.UserFriendlyMaterialName(item))); + p.playSound(p.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1.0f, 1.0f); + GenericFunctions.playProperEquipSound(p,armor.getType()); + p.updateInventory(); + return true; + } else + if (ArrowQuiver.isValidQuiver(armor) && p.getInventory().getExtraContents()[0]==null) { p.getInventory().setExtraContents(new ItemStack[]{armor}); p.sendMessage(ChatColor.DARK_AQUA+"Automatically equipped "+ChatColor.YELLOW+(item.getItemMeta().hasDisplayName()?item.getItemMeta().getDisplayName():GenericFunctions.UserFriendlyMaterialName(item))); p.playSound(p.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1.0f, 1.0f); GenericFunctions.playProperEquipSound(p,armor.getType()); + p.updateInventory(); return true; } } @@ -5190,45 +5591,224 @@ public class TwosideKeeper extends JavaPlugin implements Listener { } } + @EventHandler(priority=EventPriority.LOWEST,ignoreCancelled = true) + public void onPlayerShootProjectile(EntityShootBowEvent ev) { + if (ev.getProjectile() instanceof Projectile) { + Projectile arr = (Projectile)ev.getProjectile(); + if (arr.getShooter() instanceof Player) { + int slot = getSlotArrowShotFrom((Player)arr.getShooter()); + if (slot!=-1) { //We have to have an arrow to continue... + ItemStack item = ((Player)arr.getShooter()).getInventory().getContents()[slot]; + if (ArrowQuiver.isValidQuiver(item)) { + boolean infinitearrow=false; + int prevmode = ArrowQuiver.getArrowQuiverMode(((Player)arr.getShooter()).getInventory().getContents()[slot]); + int amtremaining = ArrowQuiver.getContents(ArrowQuiver.getID(((Player)arr.getShooter()).getInventory().getContents()[slot])).get(prevmode).clone().getAmount(); + if (ArrowQuiver.isQuiverEmpty(item)) { + ((Player)arr.getShooter()).sendMessage(ChatColor.YELLOW+"Your quiver ran out of arrows! "+ChatColor.WHITE+"You will need to fill it up again!"); + ev.setCancelled(true); + } else { + ItemStack item2 = null; + double infinitychance = GenericFunctions.calculateInfinityChance(((Player)arr.getShooter()).getEquipment().getItemInMainHand()); + if (Math.random()<=infinitychance) { + item2 = ArrowQuiver.ReturnAndRemoveShotArrow(item,((Player)arr.getShooter()).getEquipment().getItemInMainHand()); + infinitearrow=true; + arr.setMetadata("INFINITEARROW", new FixedMetadataValue(this,true)); + } else { + item2 = ArrowQuiver.ReturnAndRemoveShotArrow(item); + } + //We can now do something specific to the projectile based on the item. + ConvertToArrowWithProperties(arr, item2); + + if (arr.getShooter() instanceof Player && + arr.hasMetadata("PIERCING_ARR")) { + Player p = (Player)arr.getShooter(); + ShootPiercingArrow(arr, p); + ev.setCancelled(true); + } + } + //((Player)arr.getShooter()).playSound(arr.getLocation(),Sound.ENTITY_ARROW_SHOOT,1.0f,1.0f); + //ev.setProjectile(ArrowQuiver.getProjectileFromQuiver(((Player)arr.getShooter()).getEquipment().getItemInOffHand(), arr)); + final ItemStack quiver = item.clone(); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {((Player)arr.getShooter()).getInventory().setItem(slot, quiver); + ArrowQuiver.updateQuiverLore(((Player)arr.getShooter()).getInventory().getContents()[slot]); + int currmode = ArrowQuiver.getArrowQuiverMode(((Player)arr.getShooter()).getInventory().getContents()[slot]); + int newamtremaining = ArrowQuiver.getContents(ArrowQuiver.getID(((Player)arr.getShooter()).getInventory().getContents()[slot])).get(currmode).getAmount(); + TwosideKeeper.log("prevmode: "+prevmode+", currmode: "+currmode+", remaining: "+amtremaining+", newremaining: "+newamtremaining, 5); + if (prevmode!=currmode || newamtremaining>amtremaining) { + String message = ChatColor.DARK_GRAY+"Now Firing "+ChatColor.YELLOW+GenericFunctions.UserFriendlyMaterialName(ArrowQuiver.getContents(ArrowQuiver.getID(((Player)arr.getShooter()).getInventory().getContents()[slot])).get(currmode))+ChatColor.GRAY+" ["+ArrowQuiver.getContents(ArrowQuiver.getID(((Player)arr.getShooter()).getInventory().getContents()[slot])).get(currmode).getAmount()+"]"; + GenericFunctions.sendActionBarMessage((Player)arr.getShooter(), message, true); + } + },1); + if (infinitearrow) { + TwosideKeeper.log("Infinite SEt.", 5); + arr.setMetadata("INFINITEARROW", new FixedMetadataValue(this,true)); + } + return; + } else { + //Handle infinity separately if it's not a normal arrow. + if (arr.getType()==EntityType.TIPPED_ARROW || arr.getType()==EntityType.SPECTRAL_ARROW) { + double infinitychance = GenericFunctions.calculateInfinityChance(((Player)arr.getShooter())); + if (Math.random()<=infinitychance) { + item.setAmount(item.getAmount()+1); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {((Player)arr.getShooter()).getInventory().setItem(slot, item);},1); + TwosideKeeper.log("Infinite SEt.", 5); + arr.setMetadata("INFINITEARROW", new FixedMetadataValue(this,true)); + } + } + } + } + } + } + } + public static void ShootPiercingArrow(Projectile arr, Player p) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + p.playSound(p.getLocation(), Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.6f); + pd.lastarrowwasinrangermode=true; + Collection targets = aPlugin.API.rayTraceTargetEntities(p, 100); + Location arrowloc = arr.getLocation().clone(); + Vector dir = arr.getVelocity().clone(); + for (int i=0;i<100;i++) { + aPlugin.API.displayEndRodParticle(arrowloc, (float)0.0f, (float)0.0f, (float)0.0f, 0.0f, 1); + arrowloc=arrowloc.add(dir); + } + for (LivingEntity le : targets) { + CustomDamage.ApplyDamage(0, arr, le, p.getEquipment().getItemInMainHand(), null, CustomDamage.IGNORE_DAMAGE_TICK); + aPlugin.API.displayEndRodParticle(le.getLocation(), (float)0.05f, (float)0.05f, (float)0.05f, 0.1f, 4); + } + pd.lastarrowwasinrangermode=false; + } + + private int getSlotArrowShotFrom(Player p) { + if (GenericFunctions.isValidArrow(p.getInventory().getContents()[40],true)) { + return 40; + } else { + ItemStack[] contents = p.getInventory().getContents(); + for (int i=0;i0) { + arr.setMetadata("TIPPED_ARROW", new FixedMetadataValue(TwosideKeeper.plugin,effectstring.toString())); + } + String effect2string = pm.getBasePotionData().getType().name()+","+pm.getBasePotionData().isExtended()+","+pm.getBasePotionData().isUpgraded(); + TwosideKeeper.log("Base Arrow is "+effect2string, 5); + arr.setMetadata("BASE_ARROW", new FixedMetadataValue(TwosideKeeper.plugin,effect2string.toString())); + } + } + if (item.getType()==Material.SPECTRAL_ARROW) { + arr.setMetadata("TIPPED_ARROW", new FixedMetadataValue(TwosideKeeper.plugin,"GLOWING,100,1")); + } + } + } @EventHandler(priority=EventPriority.LOW,ignoreCancelled = true) public void onArrowShoot(ProjectileLaunchEvent ev) { + TwosideKeeper.log("Launch event.", 5); if (ev.getEntity() instanceof Projectile) { Projectile arr = (Projectile)ev.getEntity(); //Arrow newarrow = arr.getLocation().getWorld().spawnArrow(arr.getLocation(), arr.getVelocity(), 1, 12); + if (arr.getCustomName()==null && (arr instanceof Arrow)) { if (arr.getType()==EntityType.TIPPED_ARROW) { //This might be special. Let's get the potion meta. TippedArrow ta = (TippedArrow)arr; - List eff = ta.getCustomEffects(); - //This is custom! Let's see what it is. - for (int i=0;i eff = ta.getCustomEffects(); + //This is custom! Let's see what it is. + for (int i=0;i", 5); + } LivingEntity checkent = aPlugin.API.getTargetEntity(p, 100); if (checkent!=null && (checkent instanceof Monster)) { if (!livingentitydata.containsKey(checkent.getUniqueId())) { @@ -5244,89 +5824,33 @@ public class TwosideKeeper extends JavaPlugin implements Listener { } if (PlayerMode.isRanger(p)) { LivingEntity findtarget = aPlugin.API.rayTraceTargetEntity(p,100); - if (findtarget==null || !p.hasLineOfSight(findtarget)) { - if (GenericFunctions.getBowMode(p.getEquipment().getItemInMainHand())==BowMode.SNIPE) {arr.setVelocity(arr.getVelocity().multiply(1000));} - } else { - //We found a target, we are going to disable this arrow and create an artifical arrow hit from here. - //p.getWorld().spawnArrow(aPlugin.API.getProjectedArrowHitLocation(findtarget, p), arr.get, arg2, arg3); - Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { - public void run() { - arr.teleport(aPlugin.API.getProjectedArrowHitLocation(findtarget, p).subtract(arr.getVelocity())); - log("Teleported to calculated hit location: "+arr.getLocation(),5); - }},1); - } - log(arr.getVelocity().lengthSquared()+"",2); - //arr.setVelocity(arr.getVelocity().multiply(3.0/arr.getVelocity().lengthSquared())); - if (GenericFunctions.getBowMode(p.getEquipment().getItemInMainHand())==BowMode.SNIPE) { + if (GenericFunctions.getBowMode(p.getEquipment().getItemInMainHand())==BowMode.SNIPE) { + if (findtarget==null || !p.hasLineOfSight(findtarget)) { + arr.setVelocity(arr.getVelocity().multiply(1000)); + } else { + //We found a target, we are going to disable this arrow and create an artifical arrow hit from here. + //p.getWorld().spawnArrow(aPlugin.API.getProjectedArrowHitLocation(findtarget, p), arr.get, arg2, arg3); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + public void run() { + arr.teleport(aPlugin.API.getProjectedArrowHitLocation(findtarget, p).subtract(arr.getVelocity())); + log("Teleported to calculated hit location: "+arr.getLocation(),5); + }},1); + } aPlugin.API.damageItem(p, p.getEquipment().getItemInMainHand(), 3); - //p.getEquipment().getItemInMainHand().setDurability((short)(p.getEquipment().getItemInMainHand().getDurability()+1)); - } - //p.getWorld().spawnArrow(arr.getLocation(), arr.getLocation().getDirection(), 20, 1); + } } PlayerStructure pd = (PlayerStructure)playerdata.get(p.getUniqueId()); pd.lastarrowpower=arr.getVelocity().lengthSquared(); pd.lastarrowwasinrangermode=(PlayerMode.isRanger(p)&&GenericFunctions.getBowMode(p.getEquipment().getItemInMainHand())==BowMode.SNIPE); log("Arrow velocity is "+arr.getVelocity().lengthSquared(),5); arr.setCustomName("HIT"); + if (arr.hasMetadata("INFINITEARROW")) { + TwosideKeeper.log("Infinite Arrow 3", 5); + } } } } - @EventHandler(priority=EventPriority.LOW,ignoreCancelled = true) - public void onArrowShot(EntityShootBowEvent ev) { - //Check if it's a player. - if (ev.getEntityType()==EntityType.PLAYER && - (ev.getProjectile().getType()==EntityType.ARROW || - 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(); - //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. - //Then queue a delayed event to add it back in if it's gone next tick. - if (playerHasArrowQuiver(p)) { - log("A tipped arrow was shot. This could've been the arrow quiver. We will verify in 1 tick.",5); - final int ArrowQuiver_amt = playerGetArrowQuiverAmt(p,playerGetArrowQuiver(p)); - boolean temp=false; //Check if it went in the off-hand slot. If so, put it back there. - if (p.getInventory().getItemInOffHand().equals(p.getInventory().getItem(playerGetArrowQuiver(p)))) { - temp=true; - } - if ((ArrowQuiver_amt-1)<=0 || (ArrowQuiver_amt%10+1)==0) { - p.sendMessage(ChatColor.DARK_GRAY+"You have "+ChatColor.YELLOW+(ArrowQuiver_amt-1)+ChatColor.DARK_GRAY+" arrows left in your quiver."); - } - final boolean offhand=temp; - if (ArrowQuiver_amt==0){ /*Cancel this event...*/ ev.getProjectile().remove(); ev.setCancelled(true); } - Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { - public void run() { - if (p!=null) { - if (!playerHasArrowQuiver(p)) { - log("This player does not have a quiver! Let's give them one back!",5); - //We have to give one back. - ItemStack ArrowQuiver = new ItemStack(Material.TIPPED_ARROW); - List arrow_quiver_lore = new ArrayList(); - arrow_quiver_lore.add("A quiver that holds many arrows."); - arrow_quiver_lore.add(ChatColor.GRAY+"Arrows Remaining: "+ChatColor.YELLOW+(ArrowQuiver_amt-1)); - ItemMeta arrow_quiver_meta=ArrowQuiver.getItemMeta(); - arrow_quiver_meta.setLore(arrow_quiver_lore); - arrow_quiver_meta.setDisplayName(ChatColor.BLUE+"Arrow Quiver"); - ArrowQuiver.setItemMeta(arrow_quiver_meta); - - ArrowQuiver.addUnsafeEnchantment(Enchantment.ARROW_INFINITE, 5); - - ArrowQuiver.setAmount(1); - if (!offhand) {p.getInventory().addItem(ArrowQuiver);} else {p.getInventory().setItemInOffHand(ArrowQuiver);} - } else { - p.sendMessage(ChatColor.ITALIC+""+ChatColor.GRAY+"If you are trying to shoot a regular arrow, put it inside your quiver and shoot again."); - } - } - }} - ,1); - } - } - - } - } - @EventHandler(priority=EventPriority.LOW,ignoreCancelled = true) public void onItemCraftEvent(PrepareItemCraftEvent ev) { ItemStack result = ev.getInventory().getResult(); @@ -5759,6 +6283,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { //getConfig().set("RECYCLECHANCE", RECYCLECHANCE); //getConfig().set("RECYCLEDECAYAMT", RECYCLEDECAYAMT); getConfig().set("ITEMCUBEID", ITEMCUBEID); + getConfig().set("ARROWQUIVERID", ARROWQUIVERID); //getConfig().set("ARMOR/ARMOR_LEATHER_HP", ARMOR_LEATHER_HP); //getConfig().set("ARMOR/ARMOR_IRON_HP", ARMOR_IRON_HP); //getConfig().set("ARMOR/ARMOR_GOLD_HP", ARMOR_GOLD_HP); @@ -5817,6 +6342,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { getConfig().addDefault("RECYCLECHANCE", RECYCLECHANCE); getConfig().addDefault("RECYCLEDECAYAMT", RECYCLEDECAYAMT); getConfig().addDefault("ITEMCUBEID", ITEMCUBEID); + getConfig().addDefault("ARROWQUIVERID", ARROWQUIVERID); getConfig().addDefault("MOTD", MOTD); getConfig().addDefault("ARMOR/ARMOR_LEATHER_HP", ARMOR_LEATHER_HP); getConfig().addDefault("ARMOR/ARMOR_IRON_HP", ARMOR_IRON_HP); @@ -5850,6 +6376,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { RECYCLECHANCE = getConfig().getDouble("RECYCLECHANCE"); RECYCLEDECAYAMT = getConfig().getDouble("RECYCLEDECAYAMT"); ITEMCUBEID = getConfig().getInt("ITEMCUBEID"); + ARROWQUIVERID = getConfig().getInt("ARROWQUIVERID"); ARMOR_LEATHER_HP = getConfig().getDouble("ARMOR/ARMOR_LEATHER_HP"); ARMOR_IRON_HP = getConfig().getDouble("ARMOR/ARMOR_IRON_HP"); ARMOR_GOLD_HP = getConfig().getDouble("ARMOR/ARMOR_GOLD_HP"); @@ -6116,66 +6643,6 @@ public class TwosideKeeper extends JavaPlugin implements Listener { return bar; } - //Returns if a player has an arrow quiver in their inventory. - public boolean playerHasArrowQuiver(Player p) { - log("Checking an inventory of size "+p.getInventory().getSize()+" for arrow quiver.",5); - for (ItemStack item : p.getInventory().getContents()) { - if (item!=null && - item.getType()==Material.TIPPED_ARROW && - item.getEnchantmentLevel(Enchantment.ARROW_INFINITE)==5) { - return true; - } - } - return false; - } - - //Returns the slot of the first arrow quiver in a player's inventory. Returns -1 if not found. Recommended to use playerHasArrowQuiver() first. - public int playerGetArrowQuiver(Player p) { - for (int i=0;i newlore = ArrowQuiver.getItemMeta().getLore(); - newlore.set(1, ChatColor.GRAY+"Arrows Remaining: "+ChatColor.YELLOW+ArrowQuiver_amt); - ArrowQuiver_meta.setLore(newlore); - ArrowQuiver.setItemMeta(ArrowQuiver_meta); - } - - public int playerGetArrowQuiverAmt(Player p, int slot) { - ItemStack ArrowQuiver = p.getInventory().getItem(slot); - int ArrowQuiver_amt = Integer.parseInt(ArrowQuiver.getItemMeta().getLore().get(1).split(": "+ChatColor.YELLOW)[1]); - return ArrowQuiver_amt; - } - - //Removes amt arrows in the arrow quiver in slot slot. If there's not enough arrows, sets the amount to 0. - //Returns how many arrows are left, or 0 if it's now empty. - public int playerRemoveArrowQuiver(Player p, int slot, int amt) { - ItemStack ArrowQuiver = p.getInventory().getItem(slot); - ItemMeta ArrowQuiver_meta = ArrowQuiver.getItemMeta(); - int ArrowQuiver_amt = Integer.parseInt(ArrowQuiver.getItemMeta().getLore().get(1).split(": "+ChatColor.YELLOW)[1]); - ArrowQuiver_amt -= amt; - if (ArrowQuiver_amt<0) {ArrowQuiver_amt=0;} - List newlore = ArrowQuiver.getItemMeta().getLore(); - newlore.set(1, ChatColor.GRAY+"Arrows Remaining: "+ChatColor.YELLOW+ArrowQuiver_amt); - ArrowQuiver_meta.setLore(newlore); - ArrowQuiver.setItemMeta(ArrowQuiver_meta); - return ArrowQuiver_amt; - } - ///////////////ALL PLAYER RELATED FUNCTIONS GO DOWN HERE. @@ -6370,16 +6837,13 @@ public class TwosideKeeper extends JavaPlugin implements Listener { hp+=10; GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.REGENERATION,60,(p.isBlocking())?1:0,p,false); } + if (PlayerMode.isBarbarian(p)) { + double red = 1-CustomDamage.CalculateDamageReduction(1,p,null); + hp+=(red*2)*100; + } - for (ItemStack equip : GenericFunctions.getEquipment(p)) { - ItemSet set = ItemSet.GetSet(equip); - if (set!=null) { - if (set==ItemSet.DAWNTRACKER) { - hp += set.GetBaseAmount(equip); - } - } - } + hp+=ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getEquipment(p), p, ItemSet.DAWNTRACKER, 4, 4); hp+=ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getEquipment(p), p, ItemSet.SONGSTEEL, 2, 2); /* @@ -6424,6 +6888,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { p.setHealth(slayermodehp); } p.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(hp); + p.setHealthScaled(false); } diff --git a/src/sig/plugin/TwosideKeeper/TwosideKeeperAPI.java b/src/sig/plugin/TwosideKeeper/TwosideKeeperAPI.java index 072d226..27fdf79 100644 --- a/src/sig/plugin/TwosideKeeper/TwosideKeeperAPI.java +++ b/src/sig/plugin/TwosideKeeper/TwosideKeeperAPI.java @@ -21,6 +21,7 @@ import sig.plugin.TwosideKeeper.HelperStructures.MonsterType; import sig.plugin.TwosideKeeper.HelperStructures.PlayerMode; import sig.plugin.TwosideKeeper.HelperStructures.ServerType; import sig.plugin.TwosideKeeper.HelperStructures.WorldShop; +import sig.plugin.TwosideKeeper.HelperStructures.Common.ArrowQuiver; import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions; public final class TwosideKeeperAPI { @@ -383,6 +384,14 @@ public final class TwosideKeeperAPI { GenericFunctions.setUpgradeShardTier(item, tier); } + //Arrow Quiver COMMANDS. + public static boolean isArrowQuiver(ItemStack i) { + return ArrowQuiver.isValidQuiver(i); + } + public static List getArrowQuiverContents(ItemStack i) { + return ArrowQuiver.getContentsAPI(i); + } + //Localization COMMANDS. public static String getLocalizedItemName(ItemStack i) { return GenericFunctions.UserFriendlyMaterialName(i); diff --git a/src/sig/plugin/TwosideKeeper/WorldShopManager.java b/src/sig/plugin/TwosideKeeper/WorldShopManager.java index 7ee9732..913ce1b 100644 --- a/src/sig/plugin/TwosideKeeper/WorldShopManager.java +++ b/src/sig/plugin/TwosideKeeper/WorldShopManager.java @@ -268,8 +268,8 @@ public class WorldShopManager { public void SaveShopPurchases() { File config; + new File(TwosideKeeper.filesave,"shoppurchases.data").delete(); config = new File(TwosideKeeper.filesave,"shoppurchases.data"); - config.delete(); FileConfiguration workable = YamlConfiguration.loadConfiguration(config); //workable.set("recycling_center.count", nodes.size()); diff --git a/src/sig/plugin/TwosideKeeper/runServerHeartbeat.java b/src/sig/plugin/TwosideKeeper/runServerHeartbeat.java index 0ce9278..ef41b62 100644 --- a/src/sig/plugin/TwosideKeeper/runServerHeartbeat.java +++ b/src/sig/plugin/TwosideKeeper/runServerHeartbeat.java @@ -14,6 +14,7 @@ import org.bukkit.entity.Monster; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.Vector; import aPlugin.DiscordMessageSender; import sig.plugin.TwosideKeeper.HelperStructures.ArtifactAbility; @@ -190,6 +191,22 @@ final class runServerHeartbeat implements Runnable { if (pd.lastcombat+(20*60)0 && pd.damagepooltime+20<=serverTickTime) { + double transferdmg = CustomDamage.getTransferDamage(p); + TwosideKeeper.log("Transfer Dmg is "+transferdmg+". Damage Pool: "+pd.damagepool, 5); + CustomDamage.ApplyDamage(transferdmg, null, p, null, "Damage Pool", CustomDamage.IGNORE_DAMAGE_TICK|CustomDamage.TRUEDMG|CustomDamage.IGNOREDODGE); + if (pd.damagepool-transferdmg<=0) { + pd.damagepool=0; + } else { + pd.damagepool-=transferdmg; + } } if (pd.last_regen_time+TwosideKeeper.HEALTH_REGENERATION_RATE<=serverTickTime) { @@ -270,23 +287,10 @@ final class runServerHeartbeat implements Runnable { GenericFunctions.deAggroNearbyTargets(p); GenericFunctions.applyStealth(p, true); } - /*List mobs = GenericFunctions.getNearbyMobs(p.getLocation(), 16); - for (Monster m : mobs) { - if (!GenericFunctions.isIsolatedTarget(m,p) && - !GenericFunctions.isSpecialGlowMonster(m) && - m.getLocation().distanceSquared(p.getLocation())<196) {GlowAPI.setGlowing(m, GlowAPI.Color.WHITE, p);} - if (GenericFunctions.isIsolatedTarget(m,p) && - !GenericFunctions.isSpecialGlowMonster(m) && - GenericFunctions.GetNearbyMonsterCount(m, 8)>0) { - GlowAPI.setGlowing(m, false, p); - } - }*/ - } else { - /*List mobs = GenericFunctions.getNearbyMobs(p.getLocation(), 16); - for (Monster m : mobs) { - if (GenericFunctions.isIsolatedTarget(m,p) && - !GenericFunctions.isSpecialGlowMonster(m)) {GlowAPI.setGlowing(m, false, p);} - }*/ + } + + if (PlayerMode.isBarbarian(p)) { + AutoConsumeFoods(p); } GenericFunctions.sendActionBarMessage(p, ""); @@ -301,6 +305,24 @@ final class runServerHeartbeat implements Runnable { TwosideKeeper.TwosideSpleefGames.TickEvent(); } + private void AutoConsumeFoods(Player p) { + if (p.getFoodLevel()<20 && PlayerMode.getPlayerMode(p)==PlayerMode.BARBARIAN) { + ItemStack[] contents = p.getInventory().getStorageContents(); + for (int i=0;i data= TwosideKeeper.livingentitydata.keySet(); TwosideKeeper.log("Size: "+TwosideKeeper.livingentitydata.size(), 2); @@ -310,9 +332,15 @@ final class runServerHeartbeat implements Runnable { //TwosideKeeper.monsterdata.remove(data); TwosideKeeper.ScheduleRemoval(TwosideKeeper.livingentitydata, ms); TwosideKeeper.ScheduleRemoval(data, id); - TwosideKeeper.log("Removed Monster Structure for "+id+".", 2); + TwosideKeeper.log("Removed Monster Structure for "+id+".", 5); } else { AddEliteStructureIfOneDoesNotExist(ms); + if (ms.GetTarget()!=null && ms.GetTarget().isValid() && !ms.GetTarget().isDead()) { + //Randomly move this monster a tiny bit in case they are stuck. + double xdir=((ms.m.getLocation().getX()>ms.GetTarget().getLocation().getX())?-0.25:0.25)+(Math.random()/8)-(Math.random()/8); + double zdir=((ms.m.getLocation().getZ()>ms.GetTarget().getLocation().getZ())?-0.25:0.25)+(Math.random()/8)-(Math.random()/8); + ms.m.setVelocity(ms.m.getVelocity().add(new Vector(xdir,0,zdir))); + } ms.UpdateGlow(); } }