From 1de2ca7711a88508ba83ce6d0dd83e924668fb59 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Sun, 24 Aug 2014 02:46:28 -0400 Subject: [PATCH 1/6] Added Breathbending Added the new Breathbending ability for air --- .../ProjectKorra/Ability/StockAbilities.java | 4 +- .../ProjectKorra/ConfigManager.java | 5 + .../projectkorra/ProjectKorra/PKListener.java | 42 ++-- .../airbending/AirbendingManager.java | 1 + .../airbending/Breathbending.java | 204 ++++++++++++++++++ src/config.yml | 5 + src/plugin.yml | 2 + 7 files changed, 247 insertions(+), 16 deletions(-) create mode 100644 src/com/projectkorra/ProjectKorra/airbending/Breathbending.java diff --git a/src/com/projectkorra/ProjectKorra/Ability/StockAbilities.java b/src/com/projectkorra/ProjectKorra/Ability/StockAbilities.java index 0316d8a6..c3b3d3fb 100644 --- a/src/com/projectkorra/ProjectKorra/Ability/StockAbilities.java +++ b/src/com/projectkorra/ProjectKorra/Ability/StockAbilities.java @@ -18,10 +18,10 @@ public enum StockAbilities { AvatarState, // Project Korra - Extraction, Smokescreen, Combustion; + Extraction, Smokescreen, Combustion, Breathbending; private enum AirbendingAbilities { - AirBlast, AirBubble, AirShield, AirSuction, AirSwipe, Tornado, AirScooter, AirSpout, AirBurst; + AirBlast, AirBubble, AirShield, AirSuction, AirSwipe, Tornado, AirScooter, AirSpout, AirBurst, Breathbending; } private enum WaterbendingAbilities { diff --git a/src/com/projectkorra/ProjectKorra/ConfigManager.java b/src/com/projectkorra/ProjectKorra/ConfigManager.java index 836582d2..a6c4f4f6 100644 --- a/src/com/projectkorra/ProjectKorra/ConfigManager.java +++ b/src/com/projectkorra/ProjectKorra/ConfigManager.java @@ -188,6 +188,11 @@ public class ConfigManager { config.addDefault("Abilities.Air.AirSwipe.Speed", 25); config.addDefault("Abilities.Air.AirSwipe.Cooldown", 1500); config.addDefault("Abilities.Air.AirSwipe.ChargeFactor", 3); + + config.addDefault("Abilities.Air.Breathbending.Enabled", true); + config.addDefault("Abilities.Air.Breathbending.CanBeUsedOnUndeadMobs", true); + config.addDefault("Abilities.Air.Breathbending.Range", 5); + config.addDefault("Abilities.Air.Breathbending.Damage", 0.5); config.addDefault("Abilities.Air.Tornado.Radius", 10); config.addDefault("Abilities.Air.Tornado.Height", 25); diff --git a/src/com/projectkorra/ProjectKorra/PKListener.java b/src/com/projectkorra/ProjectKorra/PKListener.java index fee2041f..96b2d3b0 100644 --- a/src/com/projectkorra/ProjectKorra/PKListener.java +++ b/src/com/projectkorra/ProjectKorra/PKListener.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; @@ -54,6 +53,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerToggleFlightEvent; import org.bukkit.event.player.PlayerToggleSneakEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.util.Vector; @@ -68,6 +68,7 @@ import com.projectkorra.ProjectKorra.airbending.AirShield; import com.projectkorra.ProjectKorra.airbending.AirSpout; import com.projectkorra.ProjectKorra.airbending.AirSuction; import com.projectkorra.ProjectKorra.airbending.AirSwipe; +import com.projectkorra.ProjectKorra.airbending.Breathbending; import com.projectkorra.ProjectKorra.airbending.Tornado; import com.projectkorra.ProjectKorra.chiblocking.ChiPassive; import com.projectkorra.ProjectKorra.chiblocking.HighJump; @@ -153,7 +154,7 @@ public class PKListener implements Listener { event.setCancelled(true); return; } - if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player)) { + if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player) || Breathbending.isBreathbent(player)) { event.setCancelled(true); } @@ -229,7 +230,7 @@ public class PKListener implements Listener { if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { Methods.cooldowns.put(player.getName(), System.currentTimeMillis()); } - if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player)) { + if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player) || Breathbending.isBreathbent(player)) { event.setCancelled(true); } } @@ -239,7 +240,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Player player = event.getPlayer(); Methods.cooldowns.put(player.getName(), System.currentTimeMillis()); - if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player)) { + if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player) || Breathbending.isBreathbent(player)) { event.setCancelled(true); } } @@ -305,7 +306,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; - if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player)) { + if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player) || Breathbending.isBreathbent(player)) { event.setCancelled(true); return; } @@ -346,6 +347,9 @@ public class PKListener implements Listener { if (abil.equalsIgnoreCase("AirShield")) { new AirShield(player); } + if(abil.equalsIgnoreCase("Breathbending")) { + new Breathbending(player); + } } @@ -488,6 +492,10 @@ public class PKListener implements Listener { player.setVelocity(new Vector(0, 0, 0)); } } + + if(Breathbending.isBreathbent(player)) { + player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 1, 100)); + } } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) @@ -515,7 +523,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Entity entity = event.getEntity(); - if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity)) + if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) event.setCancelled(true); } @@ -559,7 +567,7 @@ public class PKListener implements Listener { Entity entity = event.getEntity(); if (entity != null) if (Paralyze.isParalyzed(entity) - || Bloodbending.isBloodbended(entity)) + || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) event.setCancelled(true); } @@ -568,7 +576,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Entity entity = event.getEntity(); - if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity)) + if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) event.setCancelled(true); } @@ -577,7 +585,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Entity entity = event.getEntity(); - if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity)) + if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) event.setCancelled(true); } @@ -586,7 +594,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Entity entity = event.getEntity(); - if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity)) + if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) event.setCancelled(true); } @@ -595,7 +603,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Entity entity = event.getEntity(); - if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity)) + if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) event.setCancelled(true); } @@ -604,7 +612,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Entity entity = event.getEntity(); - if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity)) + if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) event.setCancelled(true); } @@ -615,7 +623,7 @@ public class PKListener implements Listener { Player player = event.getPlayer(); - if (Bloodbending.isBloodbended(player) || Paralyze.isParalyzed(player)) { + if (Bloodbending.isBloodbended(player) || Paralyze.isParalyzed(player) || Breathbending.isBreathbent(player)) { event.setCancelled(true); return; } @@ -816,7 +824,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Player p = event.getPlayer(); - if (Tornado.getPlayers().contains(p) || Bloodbending.isBloodbended(p) + if (Tornado.getPlayers().contains(p) || Bloodbending.isBloodbended(p) || Breathbending.isBreathbent(p) || FireJet.getPlayers().contains(p) || AvatarState.getPlayers().contains(p)) { event.setCancelled(p.getGameMode() != GameMode.CREATIVE); @@ -996,6 +1004,12 @@ public class PKListener implements Listener { e.setCancelled(true); return; } + + if (Breathbending.isBreathbent(e.getEntity())) { + if(e.getCause() == DamageCause.CUSTOM) { + Breathbending.breakBreathbend(e.getEntity()); + } + } Entity en = e.getEntity(); if (en instanceof Player) { diff --git a/src/com/projectkorra/ProjectKorra/airbending/AirbendingManager.java b/src/com/projectkorra/ProjectKorra/airbending/AirbendingManager.java index 3f30d11a..da59d7e5 100644 --- a/src/com/projectkorra/ProjectKorra/airbending/AirbendingManager.java +++ b/src/com/projectkorra/ProjectKorra/airbending/AirbendingManager.java @@ -18,6 +18,7 @@ public class AirbendingManager implements Runnable { AirPassive.handlePassive(Bukkit.getServer()); AirBurst.progressAll(); AirScooter.progressAll(); + Breathbending.progressAll(); AirSpout.spoutAll(); AirBubble.handleBubbles(Bukkit.getServer()); AirSuction.progressAll(); diff --git a/src/com/projectkorra/ProjectKorra/airbending/Breathbending.java b/src/com/projectkorra/ProjectKorra/airbending/Breathbending.java new file mode 100644 index 00000000..d77dd4c2 --- /dev/null +++ b/src/com/projectkorra/ProjectKorra/airbending/Breathbending.java @@ -0,0 +1,204 @@ +package com.projectkorra.ProjectKorra.airbending; + +import java.util.ArrayList; +import java.util.concurrent.ConcurrentHashMap; + +import org.bukkit.Location; +import org.bukkit.entity.Creature; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import com.projectkorra.ProjectKorra.Methods; +import com.projectkorra.ProjectKorra.ProjectKorra; +import com.projectkorra.ProjectKorra.TempPotionEffect; +import com.projectkorra.ProjectKorra.Ability.AvatarState; + +public class Breathbending { + + public static ConcurrentHashMap instances = new ConcurrentHashMap(); + + ConcurrentHashMap targetentities = new ConcurrentHashMap(); + + private static boolean canBeUsedOnUndead = ProjectKorra.plugin.getConfig().getBoolean("Abilities.Air.Breathbending.CanBeUsedOnUndeadMobs"); + private int range = ProjectKorra.plugin.getConfig().getInt("Abilities.Air.Breathbending.Range"); + private double damage = ProjectKorra.plugin.getConfig().getDouble("Abilities.Air.Breathbending.Damage"); + + private Player player; + + public Breathbending(Player player) { + if (instances.containsKey(player)) { + remove(player); + return; + } + + if (AvatarState.isAvatarState(player)) { + range = AvatarState.getValue(range); + for (Entity entity : Methods.getEntitiesAroundPoint(player.getLocation(), range)) { + if (entity instanceof LivingEntity) { + if (entity instanceof Player) { + if (Methods.isRegionProtectedFromBuild(player, "Bloodbending", entity.getLocation()) || entity.getEntityId() == player.getEntityId()) + continue; + } + Methods.damageEntity(player, entity, 0); + targetentities.put(entity, entity.getLocation().clone()); + } + } + } else { + Entity target = Methods.getTargetedEntity(player, range, new ArrayList()); + if (target == null) + return; + if (!(target instanceof LivingEntity)|| Methods.isRegionProtectedFromBuild(player, "Bloodbending", target.getLocation())) + return; + if (!canBeUsedOnUndead && isUndead(target)) { + return; + } + Methods.damageEntity(player, target, 0); + targetentities.put(target, target.getLocation().clone()); + } + this.player = player; + instances.put(player, this); + } + + private void progress() { + PotionEffect slow = new PotionEffect(PotionEffectType.SLOW, 60, 1); + PotionEffect nausea = new PotionEffect(PotionEffectType.SLOW, 60, 1); + + if (!player.isSneaking()) { + remove(player); + return; + } + + if (!canBeUsedOnUndead) { + for (Entity entity: targetentities.keySet()) { + if (isUndead(entity)) { + targetentities.remove(entity); + } + } + } + + if (!Methods.canBend(player.getName(), "Breathbending")) { + remove(player); + return; + } + if (Methods.getBoundAbility(player) == null) { + remove(player); + return; + } + if (!Methods.getBoundAbility(player).equalsIgnoreCase("Breathbending")) { + remove(player); + return; + } + + if (AvatarState.isAvatarState(player)) { + ArrayList entities = new ArrayList(); + for (Entity entity : Methods.getEntitiesAroundPoint(player.getLocation(), range)) { + if (Methods.isRegionProtectedFromBuild(player, "Breathbending", entity.getLocation())) + continue; + entities.add(entity); + if (!targetentities.containsKey(entity) && entity instanceof LivingEntity) { + Methods.damageEntity(player, entity, 0); + targetentities.put(entity, entity.getLocation().clone()); + } + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).damage(damage); + new TempPotionEffect((LivingEntity) entity, slow); + new TempPotionEffect((LivingEntity) entity, nausea); + entity.setFallDistance(0); + if (entity instanceof Creature) { + ((Creature) entity).setTarget(player); + } + if (entity.isDead()) { + instances.remove(player); + } + entity.teleport(entity); + for(Location airsphere : Methods.getCircle(entity.getLocation(), 3, 3, false, true, 0)) { + Methods.playAirbendingParticles(airsphere, 1); + } + } + } + for (Entity entity : targetentities.keySet()) { + if (!entities.contains(entity)) + targetentities.remove(entity); + } + } else { + for (Entity entity : targetentities.keySet()) { + if(entity instanceof LivingEntity) { + ((LivingEntity) entity).damage(damage); + new TempPotionEffect((LivingEntity) entity, slow); + new TempPotionEffect((LivingEntity) entity, nausea); + entity.setFallDistance(0); + if (entity instanceof Creature) { + ((Creature) entity).setTarget(null); + } + if (entity.isDead()) { + instances.remove(player); + } + entity.teleport(entity); + for(Location airsphere : Methods.getCircle(entity.getLocation(), 3, 3, true, true, 0)) { + Methods.playAirbendingParticles(airsphere, 1); + } + } + } + } + } + + public static void progressAll() { + for (Player player : instances.keySet()) { + instances.get(player).progress(); + } + } + + public static void remove(Player player) { + if (instances.containsKey(player)) { + instances.remove(player); + } + } + + public static void breakBreathbend(Entity entity) { + for (Player player : instances.keySet()) { + if (instances.get(player).targetentities.containsKey(entity)) { + instances.remove(player); + } + } + } + + public static boolean isBreathbent(Entity entity) { + for (Player player : instances.keySet()) { + if (instances.get(player).targetentities.containsKey(entity)) { + return true; + } + } + return false; + } + + public static boolean isUndead(Entity entity) { + if (entity == null) return false; + if (entity.getType() == EntityType.ZOMBIE + || entity.getType() == EntityType.BLAZE + || entity.getType() == EntityType.GIANT + || entity.getType() == EntityType.IRON_GOLEM + || entity.getType() == EntityType.MAGMA_CUBE + || entity.getType() == EntityType.PIG_ZOMBIE + || entity.getType() == EntityType.SKELETON + || entity.getType() == EntityType.SLIME + || entity.getType() == EntityType.SNOWMAN + || entity.getType() == EntityType.ZOMBIE) { + return true; + } + return false; + } + + public static Location getBreathbendingLocation(Entity entity) { + for (Player player : instances.keySet()) { + if (instances.get(player).targetentities.containsKey(entity)) { + return instances.get(player).targetentities.get(entity); + } + } + return null; + } + +} \ No newline at end of file diff --git a/src/config.yml b/src/config.yml index ba2f9d53..aa199b5a 100644 --- a/src/config.yml +++ b/src/config.yml @@ -138,6 +138,11 @@ Abilities: Speed: 25 Cooldown: 1500 ChargeFactor: 3 + Breathbending: + Enabled: true + CanBeUsedOnUndeadMobs: true + Range: 5 + Damage: 0.5 Tornado: Enabled: true Description: "To use, simply sneak (default: shift). This will create a swirling vortex at the targeted location. Any creature or object caught in the vortex will be launched up and out in some random direction. If another player gets caught in the vortex, the launching effect is minimal. Tornado can also be used to transport the user. If the user gets caught in his/her own tornado, his/her movements are much more manageable. Provided the user doesn't fall out of the vortex, it will take him to a maximum height and move him in the general direction he/she is looking. Skilled airbenders can scale anything with this ability." diff --git a/src/plugin.yml b/src/plugin.yml index f9ed64ac..673df0c5 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -20,6 +20,7 @@ permissions: bending.admin.choose: true bending.ability.AvatarState: true bending.ability.Bloodbending: true + bending.ability.Breathbending: true bending.command.import: true bending.command.toggle.all: true bending.player: @@ -51,6 +52,7 @@ permissions: bending.ability.AirSpout: true bending.ability.AirSuction: true bending.ability.AirSwipe: true + bending.ability.Breathbending: true bending.ability.Tornado: true bending.air.passive: true bending.water: From 15afefe1818f3427e37b02ee4e106068e173202f Mon Sep 17 00:00:00 2001 From: Anonymous1432 Date: Sun, 24 Aug 2014 02:48:43 -0400 Subject: [PATCH 2/6] Update plugin.yml Fixed breathbending permissions --- src/plugin.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugin.yml b/src/plugin.yml index 673df0c5..b05eb840 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -20,7 +20,6 @@ permissions: bending.admin.choose: true bending.ability.AvatarState: true bending.ability.Bloodbending: true - bending.ability.Breathbending: true bending.command.import: true bending.command.toggle.all: true bending.player: @@ -117,4 +116,4 @@ permissions: bending.chi.grapplinghook: true bending.avatar: default: false - description: Grants the Avatar Color. \ No newline at end of file + description: Grants the Avatar Color. From 13ee8969f39a949e2d6c1a2122657b7cb9d24033 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Sun, 24 Aug 2014 03:37:01 -0400 Subject: [PATCH 3/6] Breathbending Updates Added a method to free an entity from breathbending, and allowed players to use simple bendings (AirSwipe, WaterManipulation, FireBlast, EarthBlast) even if they are being BreathBent. --- .../projectkorra/ProjectKorra/Methods.java | 7 +++++++ .../projectkorra/ProjectKorra/PKListener.java | 21 ++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/com/projectkorra/ProjectKorra/Methods.java b/src/com/projectkorra/ProjectKorra/Methods.java index ef6ac1a0..9e52b4e9 100644 --- a/src/com/projectkorra/ProjectKorra/Methods.java +++ b/src/com/projectkorra/ProjectKorra/Methods.java @@ -78,6 +78,7 @@ import com.projectkorra.ProjectKorra.airbending.AirShield; import com.projectkorra.ProjectKorra.airbending.AirSpout; import com.projectkorra.ProjectKorra.airbending.AirSuction; import com.projectkorra.ProjectKorra.airbending.AirSwipe; +import com.projectkorra.ProjectKorra.airbending.Breathbending; import com.projectkorra.ProjectKorra.airbending.Tornado; import com.projectkorra.ProjectKorra.chiblocking.Paralyze; import com.projectkorra.ProjectKorra.chiblocking.RapidPunch; @@ -1837,5 +1838,11 @@ public class Methods { if(effect.equals(PotionEffectType.INVISIBILITY)) return true; return false; } + + public static void breakBreathbendingHold(Entity entity) { + if(Breathbending.isBreathbent(entity)) { + Breathbending.breakBreathbend(entity); + } + } } diff --git a/src/com/projectkorra/ProjectKorra/PKListener.java b/src/com/projectkorra/ProjectKorra/PKListener.java index 96b2d3b0..4c88e866 100644 --- a/src/com/projectkorra/ProjectKorra/PKListener.java +++ b/src/com/projectkorra/ProjectKorra/PKListener.java @@ -305,8 +305,14 @@ public class PKListener implements Listener { Player player = event.getPlayer(); if (event.isCancelled()) return; + + if(Breathbending.isBreathbent(player)) { + if(!Methods.getBoundAbility(player).equalsIgnoreCase("AirSwipe") || !Methods.getBoundAbility(player).equalsIgnoreCase("FireBlast") || !Methods.getBoundAbility(player).equalsIgnoreCase("EarthBlast") || !Methods.getBoundAbility(player).equalsIgnoreCase("WaterManipulation")) { + event.setCancelled(true); + } + } - if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player) || Breathbending.isBreathbent(player)) { + if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player)) { event.setCancelled(true); return; } @@ -622,8 +628,14 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Player player = event.getPlayer(); + + if(Breathbending.isBreathbent(player)) { + if(!Methods.getBoundAbility(player).equalsIgnoreCase("AirSwipe") || !Methods.getBoundAbility(player).equalsIgnoreCase("FireBlast") || !Methods.getBoundAbility(player).equalsIgnoreCase("EarthBlast") || !Methods.getBoundAbility(player).equalsIgnoreCase("WaterManipulation")) { + event.setCancelled(true); + } + } - if (Bloodbending.isBloodbended(player) || Paralyze.isParalyzed(player) || Breathbending.isBreathbent(player)) { + if (Bloodbending.isBloodbended(player) || Paralyze.isParalyzed(player)) { event.setCancelled(true); return; } @@ -1005,11 +1017,6 @@ public class PKListener implements Listener { return; } - if (Breathbending.isBreathbent(e.getEntity())) { - if(e.getCause() == DamageCause.CUSTOM) { - Breathbending.breakBreathbend(e.getEntity()); - } - } Entity en = e.getEntity(); if (en instanceof Player) { From e8034450119d793785869dc36e63269473b1a1cc Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Sun, 24 Aug 2014 07:13:09 -0400 Subject: [PATCH 4/6] Converted to BreathSphere BreathBending move was converted to BreathSphere, move ready for basic use and complete enough for a release. --- .../ProjectKorra/Ability/StockAbilities.java | 4 +-- .../ProjectKorra/ConfigManager.java | 8 ++--- .../projectkorra/ProjectKorra/Methods.java | 14 ++++++-- .../projectkorra/ProjectKorra/PKListener.java | 34 +++++++++---------- .../ProjectKorra/airbending/AirBlast.java | 1 + .../ProjectKorra/airbending/AirSuction.java | 1 + .../ProjectKorra/airbending/AirSwipe.java | 2 ++ .../airbending/AirbendingManager.java | 2 +- .../{Breathbending.java => BreathSphere.java} | 31 +++++++++++------ .../ProjectKorra/airbending/Tornado.java | 2 ++ .../ProjectKorra/chiblocking/ChiPassive.java | 5 +++ .../ProjectKorra/chiblocking/Paralyze.java | 7 ++++ .../ProjectKorra/chiblocking/RapidPunch.java | 4 +++ .../ProjectKorra/earthbending/EarthBlast.java | 3 ++ .../ProjectKorra/earthbending/Ripple.java | 2 ++ .../ProjectKorra/firebending/Combustion.java | 1 + .../ProjectKorra/firebending/FireBlast.java | 1 + .../ProjectKorra/firebending/Fireball.java | 1 + .../ProjectKorra/firebending/Lightning.java | 1 + .../ProjectKorra/firebending/WallOfFire.java | 1 + .../waterbending/Bloodbending.java | 4 +++ .../waterbending/HealingWaters.java | 2 ++ .../ProjectKorra/waterbending/IceSpike.java | 1 + .../ProjectKorra/waterbending/IceSpike2.java | 1 + .../waterbending/OctopusForm.java | 1 + .../ProjectKorra/waterbending/Torrent.java | 2 ++ .../waterbending/WaterManipulation.java | 1 + .../ProjectKorra/waterbending/Wave.java | 1 + src/config.yml | 2 +- src/plugin.yml | 4 +-- 30 files changed, 103 insertions(+), 41 deletions(-) rename src/com/projectkorra/ProjectKorra/airbending/{Breathbending.java => BreathSphere.java} (87%) diff --git a/src/com/projectkorra/ProjectKorra/Ability/StockAbilities.java b/src/com/projectkorra/ProjectKorra/Ability/StockAbilities.java index c3b3d3fb..ea88ff79 100644 --- a/src/com/projectkorra/ProjectKorra/Ability/StockAbilities.java +++ b/src/com/projectkorra/ProjectKorra/Ability/StockAbilities.java @@ -18,10 +18,10 @@ public enum StockAbilities { AvatarState, // Project Korra - Extraction, Smokescreen, Combustion, Breathbending; + Extraction, Smokescreen, Combustion, BreathSphere; private enum AirbendingAbilities { - AirBlast, AirBubble, AirShield, AirSuction, AirSwipe, Tornado, AirScooter, AirSpout, AirBurst, Breathbending; + AirBlast, AirBubble, AirShield, AirSuction, AirSwipe, Tornado, AirScooter, AirSpout, AirBurst, BreathSphere; } private enum WaterbendingAbilities { diff --git a/src/com/projectkorra/ProjectKorra/ConfigManager.java b/src/com/projectkorra/ProjectKorra/ConfigManager.java index a6c4f4f6..1964d87e 100644 --- a/src/com/projectkorra/ProjectKorra/ConfigManager.java +++ b/src/com/projectkorra/ProjectKorra/ConfigManager.java @@ -189,10 +189,10 @@ public class ConfigManager { config.addDefault("Abilities.Air.AirSwipe.Cooldown", 1500); config.addDefault("Abilities.Air.AirSwipe.ChargeFactor", 3); - config.addDefault("Abilities.Air.Breathbending.Enabled", true); - config.addDefault("Abilities.Air.Breathbending.CanBeUsedOnUndeadMobs", true); - config.addDefault("Abilities.Air.Breathbending.Range", 5); - config.addDefault("Abilities.Air.Breathbending.Damage", 0.5); + config.addDefault("Abilities.Air.BreathSphere.Enabled", true); + config.addDefault("Abilities.Air.BreathSphere.CanBeUsedOnUndeadMobs", true); + config.addDefault("Abilities.Air.BreathSphere.Range", 5); + config.addDefault("Abilities.Air.BreathSphere.Damage", 0.5); config.addDefault("Abilities.Air.Tornado.Radius", 10); config.addDefault("Abilities.Air.Tornado.Height", 25); diff --git a/src/com/projectkorra/ProjectKorra/Methods.java b/src/com/projectkorra/ProjectKorra/Methods.java index 9e52b4e9..ab880255 100644 --- a/src/com/projectkorra/ProjectKorra/Methods.java +++ b/src/com/projectkorra/ProjectKorra/Methods.java @@ -78,7 +78,7 @@ import com.projectkorra.ProjectKorra.airbending.AirShield; import com.projectkorra.ProjectKorra.airbending.AirSpout; import com.projectkorra.ProjectKorra.airbending.AirSuction; import com.projectkorra.ProjectKorra.airbending.AirSwipe; -import com.projectkorra.ProjectKorra.airbending.Breathbending; +import com.projectkorra.ProjectKorra.airbending.BreathSphere; import com.projectkorra.ProjectKorra.airbending.Tornado; import com.projectkorra.ProjectKorra.chiblocking.Paralyze; import com.projectkorra.ProjectKorra.chiblocking.RapidPunch; @@ -1840,8 +1840,16 @@ public class Methods { } public static void breakBreathbendingHold(Entity entity) { - if(Breathbending.isBreathbent(entity)) { - Breathbending.breakBreathbend(entity); + if(BreathSphere.isBreathbent(entity)) { + BreathSphere.breakBreathSphere(entity); + return; + } + + if(entity instanceof Player) { + Player player = (Player) entity; + if(BreathSphere.isChannelingSphere(player)) { + BreathSphere.remove(player); + } } } diff --git a/src/com/projectkorra/ProjectKorra/PKListener.java b/src/com/projectkorra/ProjectKorra/PKListener.java index 4c88e866..45e7df83 100644 --- a/src/com/projectkorra/ProjectKorra/PKListener.java +++ b/src/com/projectkorra/ProjectKorra/PKListener.java @@ -68,7 +68,7 @@ import com.projectkorra.ProjectKorra.airbending.AirShield; import com.projectkorra.ProjectKorra.airbending.AirSpout; import com.projectkorra.ProjectKorra.airbending.AirSuction; import com.projectkorra.ProjectKorra.airbending.AirSwipe; -import com.projectkorra.ProjectKorra.airbending.Breathbending; +import com.projectkorra.ProjectKorra.airbending.BreathSphere; import com.projectkorra.ProjectKorra.airbending.Tornado; import com.projectkorra.ProjectKorra.chiblocking.ChiPassive; import com.projectkorra.ProjectKorra.chiblocking.HighJump; @@ -154,7 +154,7 @@ public class PKListener implements Listener { event.setCancelled(true); return; } - if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player) || Breathbending.isBreathbent(player)) { + if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player) || BreathSphere.isBreathbent(player)) { event.setCancelled(true); } @@ -230,7 +230,7 @@ public class PKListener implements Listener { if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { Methods.cooldowns.put(player.getName(), System.currentTimeMillis()); } - if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player) || Breathbending.isBreathbent(player)) { + if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player) || BreathSphere.isBreathbent(player)) { event.setCancelled(true); } } @@ -240,7 +240,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Player player = event.getPlayer(); Methods.cooldowns.put(player.getName(), System.currentTimeMillis()); - if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player) || Breathbending.isBreathbent(player)) { + if (Paralyze.isParalyzed(player) || Bloodbending.isBloodbended(player) || BreathSphere.isBreathbent(player)) { event.setCancelled(true); } } @@ -306,7 +306,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; - if(Breathbending.isBreathbent(player)) { + if(BreathSphere.isBreathbent(player)) { if(!Methods.getBoundAbility(player).equalsIgnoreCase("AirSwipe") || !Methods.getBoundAbility(player).equalsIgnoreCase("FireBlast") || !Methods.getBoundAbility(player).equalsIgnoreCase("EarthBlast") || !Methods.getBoundAbility(player).equalsIgnoreCase("WaterManipulation")) { event.setCancelled(true); } @@ -353,8 +353,8 @@ public class PKListener implements Listener { if (abil.equalsIgnoreCase("AirShield")) { new AirShield(player); } - if(abil.equalsIgnoreCase("Breathbending")) { - new Breathbending(player); + if(abil.equalsIgnoreCase("BreathSphere")) { + new BreathSphere(player); } } @@ -499,7 +499,7 @@ public class PKListener implements Listener { } } - if(Breathbending.isBreathbent(player)) { + if(BreathSphere.isBreathbent(player)) { player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 1, 100)); } } @@ -529,7 +529,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Entity entity = event.getEntity(); - if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) + if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || BreathSphere.isBreathbent(entity)) event.setCancelled(true); } @@ -573,7 +573,7 @@ public class PKListener implements Listener { Entity entity = event.getEntity(); if (entity != null) if (Paralyze.isParalyzed(entity) - || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) + || Bloodbending.isBloodbended(entity) || BreathSphere.isBreathbent(entity)) event.setCancelled(true); } @@ -582,7 +582,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Entity entity = event.getEntity(); - if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) + if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || BreathSphere.isBreathbent(entity)) event.setCancelled(true); } @@ -591,7 +591,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Entity entity = event.getEntity(); - if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) + if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || BreathSphere.isBreathbent(entity)) event.setCancelled(true); } @@ -600,7 +600,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Entity entity = event.getEntity(); - if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) + if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || BreathSphere.isBreathbent(entity)) event.setCancelled(true); } @@ -609,7 +609,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Entity entity = event.getEntity(); - if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) + if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || BreathSphere.isBreathbent(entity)) event.setCancelled(true); } @@ -618,7 +618,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Entity entity = event.getEntity(); - if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || Breathbending.isBreathbent(entity)) + if (Paralyze.isParalyzed(entity) || Bloodbending.isBloodbended(entity) || BreathSphere.isBreathbent(entity)) event.setCancelled(true); } @@ -629,7 +629,7 @@ public class PKListener implements Listener { Player player = event.getPlayer(); - if(Breathbending.isBreathbent(player)) { + if(BreathSphere.isBreathbent(player)) { if(!Methods.getBoundAbility(player).equalsIgnoreCase("AirSwipe") || !Methods.getBoundAbility(player).equalsIgnoreCase("FireBlast") || !Methods.getBoundAbility(player).equalsIgnoreCase("EarthBlast") || !Methods.getBoundAbility(player).equalsIgnoreCase("WaterManipulation")) { event.setCancelled(true); } @@ -836,7 +836,7 @@ public class PKListener implements Listener { if (event.isCancelled()) return; Player p = event.getPlayer(); - if (Tornado.getPlayers().contains(p) || Bloodbending.isBloodbended(p) || Breathbending.isBreathbent(p) + if (Tornado.getPlayers().contains(p) || Bloodbending.isBloodbended(p) || BreathSphere.isBreathbent(p) || FireJet.getPlayers().contains(p) || AvatarState.getPlayers().contains(p)) { event.setCancelled(p.getGameMode() != GameMode.CREATIVE); diff --git a/src/com/projectkorra/ProjectKorra/airbending/AirBlast.java b/src/com/projectkorra/ProjectKorra/airbending/AirBlast.java index 500efee7..a345df70 100644 --- a/src/com/projectkorra/ProjectKorra/airbending/AirBlast.java +++ b/src/com/projectkorra/ProjectKorra/airbending/AirBlast.java @@ -294,6 +294,7 @@ public class AirBlast { if (entity.getFireTicks() > 0) entity.getWorld().playEffect(entity.getLocation(), Effect.EXTINGUISH, 0); entity.setFireTicks(0); + Methods.breakBreathbendingHold(entity); } } diff --git a/src/com/projectkorra/ProjectKorra/airbending/AirSuction.java b/src/com/projectkorra/ProjectKorra/airbending/AirSuction.java index 440a28f5..9f390acd 100644 --- a/src/com/projectkorra/ProjectKorra/airbending/AirSuction.java +++ b/src/com/projectkorra/ProjectKorra/airbending/AirSuction.java @@ -256,6 +256,7 @@ public class AirSuction { entity.getWorld().playEffect(entity.getLocation(), Effect.EXTINGUISH, 0); entity.setFireTicks(0); + Methods.breakBreathbendingHold(entity); } } diff --git a/src/com/projectkorra/ProjectKorra/airbending/AirSwipe.java b/src/com/projectkorra/ProjectKorra/airbending/AirSwipe.java index d83516e8..90fc6ede 100644 --- a/src/com/projectkorra/ProjectKorra/airbending/AirSwipe.java +++ b/src/com/projectkorra/ProjectKorra/airbending/AirSwipe.java @@ -263,6 +263,8 @@ public class AirSwipe { if (entity instanceof Player) { new Flight((Player) entity, player); } + + Methods.breakBreathbendingHold(entity); if (elements.containsKey(direction)) { elements.remove(direction); diff --git a/src/com/projectkorra/ProjectKorra/airbending/AirbendingManager.java b/src/com/projectkorra/ProjectKorra/airbending/AirbendingManager.java index da59d7e5..0afc0ec4 100644 --- a/src/com/projectkorra/ProjectKorra/airbending/AirbendingManager.java +++ b/src/com/projectkorra/ProjectKorra/airbending/AirbendingManager.java @@ -18,7 +18,7 @@ public class AirbendingManager implements Runnable { AirPassive.handlePassive(Bukkit.getServer()); AirBurst.progressAll(); AirScooter.progressAll(); - Breathbending.progressAll(); + BreathSphere.progressAll(); AirSpout.spoutAll(); AirBubble.handleBubbles(Bukkit.getServer()); AirSuction.progressAll(); diff --git a/src/com/projectkorra/ProjectKorra/airbending/Breathbending.java b/src/com/projectkorra/ProjectKorra/airbending/BreathSphere.java similarity index 87% rename from src/com/projectkorra/ProjectKorra/airbending/Breathbending.java rename to src/com/projectkorra/ProjectKorra/airbending/BreathSphere.java index d77dd4c2..a3c4c64b 100644 --- a/src/com/projectkorra/ProjectKorra/airbending/Breathbending.java +++ b/src/com/projectkorra/ProjectKorra/airbending/BreathSphere.java @@ -17,19 +17,19 @@ import com.projectkorra.ProjectKorra.ProjectKorra; import com.projectkorra.ProjectKorra.TempPotionEffect; import com.projectkorra.ProjectKorra.Ability.AvatarState; -public class Breathbending { +public class BreathSphere { - public static ConcurrentHashMap instances = new ConcurrentHashMap(); + public static ConcurrentHashMap instances = new ConcurrentHashMap(); ConcurrentHashMap targetentities = new ConcurrentHashMap(); - private static boolean canBeUsedOnUndead = ProjectKorra.plugin.getConfig().getBoolean("Abilities.Air.Breathbending.CanBeUsedOnUndeadMobs"); - private int range = ProjectKorra.plugin.getConfig().getInt("Abilities.Air.Breathbending.Range"); - private double damage = ProjectKorra.plugin.getConfig().getDouble("Abilities.Air.Breathbending.Damage"); + private static boolean canBeUsedOnUndead = ProjectKorra.plugin.getConfig().getBoolean("Abilities.Air.BreathSphere.CanBeUsedOnUndeadMobs"); + private int range = ProjectKorra.plugin.getConfig().getInt("Abilities.Air.BreathSphere.Range"); + private double damage = ProjectKorra.plugin.getConfig().getDouble("Abilities.Air.BreathSphere.Damage"); private Player player; - public Breathbending(Player player) { + public BreathSphere(Player player) { if (instances.containsKey(player)) { remove(player); return; @@ -80,7 +80,7 @@ public class Breathbending { } } - if (!Methods.canBend(player.getName(), "Breathbending")) { + if (!Methods.canBend(player.getName(), "BreathSphere")) { remove(player); return; } @@ -88,7 +88,7 @@ public class Breathbending { remove(player); return; } - if (!Methods.getBoundAbility(player).equalsIgnoreCase("Breathbending")) { + if (!Methods.getBoundAbility(player).equalsIgnoreCase("BreathSphere")) { remove(player); return; } @@ -96,7 +96,7 @@ public class Breathbending { if (AvatarState.isAvatarState(player)) { ArrayList entities = new ArrayList(); for (Entity entity : Methods.getEntitiesAroundPoint(player.getLocation(), range)) { - if (Methods.isRegionProtectedFromBuild(player, "Breathbending", entity.getLocation())) + if (Methods.isRegionProtectedFromBuild(player, "BreathSphere", entity.getLocation())) continue; entities.add(entity); if (!targetentities.containsKey(entity) && entity instanceof LivingEntity) { @@ -158,7 +158,7 @@ public class Breathbending { } } - public static void breakBreathbend(Entity entity) { + public static void breakBreathSphere(Entity entity) { for (Player player : instances.keySet()) { if (instances.get(player).targetentities.containsKey(entity)) { instances.remove(player); @@ -192,7 +192,7 @@ public class Breathbending { return false; } - public static Location getBreathbendingLocation(Entity entity) { + public static Location getBreathSphereLocation(Entity entity) { for (Player player : instances.keySet()) { if (instances.get(player).targetentities.containsKey(entity)) { return instances.get(player).targetentities.get(entity); @@ -200,5 +200,14 @@ public class Breathbending { } return null; } + + public static boolean isChannelingSphere(Player player){ + if(instances.containsKey(player)) return true; + return false; + } + + public static void removeAll() { + instances.clear(); + } } \ No newline at end of file diff --git a/src/com/projectkorra/ProjectKorra/airbending/Tornado.java b/src/com/projectkorra/ProjectKorra/airbending/Tornado.java index 573d97b4..4c548678 100644 --- a/src/com/projectkorra/ProjectKorra/airbending/Tornado.java +++ b/src/com/projectkorra/ProjectKorra/airbending/Tornado.java @@ -150,6 +150,8 @@ public class Tornado { velocity.multiply(timefactor); entity.setVelocity(velocity); entity.setFallDistance(0); + + Methods.breakBreathbendingHold(entity); if (entity instanceof Player) { new Flight((Player) entity); diff --git a/src/com/projectkorra/ProjectKorra/chiblocking/ChiPassive.java b/src/com/projectkorra/ProjectKorra/chiblocking/ChiPassive.java index 638a9510..124de6f2 100644 --- a/src/com/projectkorra/ProjectKorra/chiblocking/ChiPassive.java +++ b/src/com/projectkorra/ProjectKorra/chiblocking/ChiPassive.java @@ -12,6 +12,7 @@ import com.projectkorra.ProjectKorra.BendingPlayer; import com.projectkorra.ProjectKorra.Element; import com.projectkorra.ProjectKorra.Methods; import com.projectkorra.ProjectKorra.ProjectKorra; +import com.projectkorra.ProjectKorra.airbending.BreathSphere; public class ChiPassive { @@ -37,9 +38,13 @@ public class ChiPassive { } public static void blockChi(final Player player) { + if(BreathSphere.isChannelingSphere(player)) { + BreathSphere.remove(player); + } final BendingPlayer bPlayer = Methods.getBendingPlayer(player.getName()); if (bPlayer == null) return; bPlayer.blockChi(); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(ProjectKorra.plugin, new Runnable() { public void run() { bPlayer.unblockChi(); diff --git a/src/com/projectkorra/ProjectKorra/chiblocking/Paralyze.java b/src/com/projectkorra/ProjectKorra/chiblocking/Paralyze.java index 45fd70bc..13316b3b 100644 --- a/src/com/projectkorra/ProjectKorra/chiblocking/Paralyze.java +++ b/src/com/projectkorra/ProjectKorra/chiblocking/Paralyze.java @@ -10,6 +10,7 @@ import com.projectkorra.ProjectKorra.Element; import com.projectkorra.ProjectKorra.Methods; import com.projectkorra.ProjectKorra.ProjectKorra; import com.projectkorra.ProjectKorra.Ability.AvatarState; +import com.projectkorra.ProjectKorra.airbending.BreathSphere; public class Paralyze { @@ -42,6 +43,12 @@ public class Paralyze { if (entity instanceof Creature) { ((Creature) entity).setTarget(null); } + + if (entity instanceof Player) { + if(BreathSphere.isChannelingSphere((Player) entity)) { + BreathSphere.remove((Player) entity); + } + } } public static boolean isParalyzed(Entity entity) { diff --git a/src/com/projectkorra/ProjectKorra/chiblocking/RapidPunch.java b/src/com/projectkorra/ProjectKorra/chiblocking/RapidPunch.java index 455d9e5c..20e68be6 100644 --- a/src/com/projectkorra/ProjectKorra/chiblocking/RapidPunch.java +++ b/src/com/projectkorra/ProjectKorra/chiblocking/RapidPunch.java @@ -12,6 +12,7 @@ import org.bukkit.entity.Player; import com.projectkorra.ProjectKorra.Methods; import com.projectkorra.ProjectKorra.ProjectKorra; +import com.projectkorra.ProjectKorra.airbending.BreathSphere; public class RapidPunch { @@ -59,6 +60,9 @@ public class RapidPunch { if (ChiPassive.willChiBlock((Player) target)) { ChiPassive.blockChi((Player) target); } + if(BreathSphere.isChannelingSphere((Player) target)) { + BreathSphere.remove((Player) target); + } lt.setNoDamageTicks(0); } cooldowns.put(p.getName(), System.currentTimeMillis()); diff --git a/src/com/projectkorra/ProjectKorra/earthbending/EarthBlast.java b/src/com/projectkorra/ProjectKorra/earthbending/EarthBlast.java index 1b3883f5..23d33521 100644 --- a/src/com/projectkorra/ProjectKorra/earthbending/EarthBlast.java +++ b/src/com/projectkorra/ProjectKorra/earthbending/EarthBlast.java @@ -389,6 +389,9 @@ public class EarthBlast { // || testblock.equals(block2)) { // entity.setVelocity(entity.getVelocity().clone() // .add(direction)); + + Methods.breakBreathbendingHold(entity); + Location location = player.getEyeLocation(); Vector vector = location.getDirection(); entity.setVelocity(vector.normalize().multiply(pushfactor)); diff --git a/src/com/projectkorra/ProjectKorra/earthbending/Ripple.java b/src/com/projectkorra/ProjectKorra/earthbending/Ripple.java index 0a3df8de..194a35ae 100644 --- a/src/com/projectkorra/ProjectKorra/earthbending/Ripple.java +++ b/src/com/projectkorra/ProjectKorra/earthbending/Ripple.java @@ -259,6 +259,8 @@ public class Ripple { Vector vector = direction.clone(); vector.setY(.5); entity.setVelocity(vector); + + Methods.breakBreathbendingHold(entity); } diff --git a/src/com/projectkorra/ProjectKorra/firebending/Combustion.java b/src/com/projectkorra/ProjectKorra/firebending/Combustion.java index 8a02c414..3fad0e90 100644 --- a/src/com/projectkorra/ProjectKorra/firebending/Combustion.java +++ b/src/com/projectkorra/ProjectKorra/firebending/Combustion.java @@ -177,6 +177,7 @@ public class Combustion { if (entity instanceof LivingEntity) { if (entity.getLocation().distance(block) < radius) { // They are close enough to the explosion. Methods.damageEntity(player, entity, damage); + Methods.breakBreathbendingHold(entity); } } } diff --git a/src/com/projectkorra/ProjectKorra/firebending/FireBlast.java b/src/com/projectkorra/ProjectKorra/firebending/FireBlast.java index 60c22cd4..08104b68 100644 --- a/src/com/projectkorra/ProjectKorra/firebending/FireBlast.java +++ b/src/com/projectkorra/ProjectKorra/firebending/FireBlast.java @@ -220,6 +220,7 @@ public class FireBlast { if (entity instanceof LivingEntity) { entity.setFireTicks(50); Methods.damageEntity(player, entity, (int) Methods.getFirebendingDayAugment((double) damage, entity.getWorld())); + Methods.breakBreathbendingHold(entity); new Enflamed(entity, player); instances.remove(id); } diff --git a/src/com/projectkorra/ProjectKorra/firebending/Fireball.java b/src/com/projectkorra/ProjectKorra/firebending/Fireball.java index dc8681e7..dbc31dc0 100644 --- a/src/com/projectkorra/ProjectKorra/firebending/Fireball.java +++ b/src/com/projectkorra/ProjectKorra/firebending/Fireball.java @@ -158,6 +158,7 @@ public class Fireball { double damage = slope * (distance - innerradius) + maxdamage; // Methods.verbose(damage); Methods.damageEntity(player, entity, damage); + Methods.breakBreathbendingHold(entity); } private void fireball() { diff --git a/src/com/projectkorra/ProjectKorra/firebending/Lightning.java b/src/com/projectkorra/ProjectKorra/firebending/Lightning.java index 19860acb..91de9405 100644 --- a/src/com/projectkorra/ProjectKorra/firebending/Lightning.java +++ b/src/com/projectkorra/ProjectKorra/firebending/Lightning.java @@ -154,6 +154,7 @@ public class Lightning { double damage = maxdamage - (distance / strikeradius) * .5; hitentities.add(entity); Methods.damageEntity(player, entity, (int) damage); + Methods.breakBreathbendingHold(entity); } public static boolean isNearbyChannel(Location location) { diff --git a/src/com/projectkorra/ProjectKorra/firebending/WallOfFire.java b/src/com/projectkorra/ProjectKorra/firebending/WallOfFire.java index 680de218..7ca555a9 100644 --- a/src/com/projectkorra/ProjectKorra/firebending/WallOfFire.java +++ b/src/com/projectkorra/ProjectKorra/firebending/WallOfFire.java @@ -187,6 +187,7 @@ public class WallOfFire { if (entity instanceof LivingEntity) { Methods.damageEntity(player, entity, damage); new Enflamed(entity, player); + Methods.breakBreathbendingHold(entity); } } diff --git a/src/com/projectkorra/ProjectKorra/waterbending/Bloodbending.java b/src/com/projectkorra/ProjectKorra/waterbending/Bloodbending.java index e1689164..d51cca66 100644 --- a/src/com/projectkorra/ProjectKorra/waterbending/Bloodbending.java +++ b/src/com/projectkorra/ProjectKorra/waterbending/Bloodbending.java @@ -54,6 +54,7 @@ public class Bloodbending { continue; } Methods.damageEntity(player, entity, 0); + Methods.breakBreathbendingHold(entity); targetentities.put(entity, entity.getLocation().clone()); } } @@ -73,6 +74,7 @@ public class Bloodbending { return; } Methods.damageEntity(player, target, 0); + Methods.breakBreathbendingHold(target); targetentities.put(target, target.getLocation().clone()); } this.player = player; @@ -166,6 +168,7 @@ public class Bloodbending { if (entity instanceof Creature) { ((Creature) entity).setTarget(null); } + Methods.breakBreathbendingHold(entity); } } for (Entity entity : targetentities.keySet()) { @@ -199,6 +202,7 @@ public class Bloodbending { if (entity instanceof Creature) { ((Creature) entity).setTarget(null); } + Methods.breakBreathbendingHold(entity); } } } diff --git a/src/com/projectkorra/ProjectKorra/waterbending/HealingWaters.java b/src/com/projectkorra/ProjectKorra/waterbending/HealingWaters.java index 56ad7098..cafcd363 100644 --- a/src/com/projectkorra/ProjectKorra/waterbending/HealingWaters.java +++ b/src/com/projectkorra/ProjectKorra/waterbending/HealingWaters.java @@ -82,6 +82,7 @@ public class HealingWaters { if (!Methods.isRegionProtectedFromBuild(player, "HealingWaters", player.getLocation())) if(player.getHealth() < player.getMaxHealth()) { player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 70, 1)); + Methods.breakBreathbendingHold(player); } // for(PotionEffect effect : player.getActivePotionEffects()) { // if(Methods.isNegativeEffect(effect.getType())) { @@ -93,6 +94,7 @@ public class HealingWaters { private static void applyHealingToEntity(LivingEntity le) { if(le.getHealth() < le.getMaxHealth()) { le.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 70, 1)); + Methods.breakBreathbendingHold(le); } // for(PotionEffect effect : le.getActivePotionEffects()) { // if(Methods.isNegativeEffect(effect.getType())) { diff --git a/src/com/projectkorra/ProjectKorra/waterbending/IceSpike.java b/src/com/projectkorra/ProjectKorra/waterbending/IceSpike.java index 2fc6b53f..7fb26a9c 100644 --- a/src/com/projectkorra/ProjectKorra/waterbending/IceSpike.java +++ b/src/com/projectkorra/ProjectKorra/waterbending/IceSpike.java @@ -243,6 +243,7 @@ public class IceSpike { PotionEffect effect = new PotionEffect(PotionEffectType.SLOW, 70, mod); new TempPotionEffect(entity, effect); } + Methods.breakBreathbendingHold(entity); } diff --git a/src/com/projectkorra/ProjectKorra/waterbending/IceSpike2.java b/src/com/projectkorra/ProjectKorra/waterbending/IceSpike2.java index 06033778..9e764cb8 100644 --- a/src/com/projectkorra/ProjectKorra/waterbending/IceSpike2.java +++ b/src/com/projectkorra/ProjectKorra/waterbending/IceSpike2.java @@ -306,6 +306,7 @@ public class IceSpike2 { new TempPotionEffect(entity, effect); entity.damage(damage, player); } + Methods.breakBreathbendingHold(entity); } diff --git a/src/com/projectkorra/ProjectKorra/waterbending/OctopusForm.java b/src/com/projectkorra/ProjectKorra/waterbending/OctopusForm.java index 2129b1ec..7e76c98b 100644 --- a/src/com/projectkorra/ProjectKorra/waterbending/OctopusForm.java +++ b/src/com/projectkorra/ProjectKorra/waterbending/OctopusForm.java @@ -134,6 +134,7 @@ public class OctopusForm { entity.setVelocity(Methods.getDirection(player.getLocation(), location).normalize().multiply(1.75)); if (entity instanceof LivingEntity) Methods.damageEntity(player, entity, damage); + Methods.breakBreathbendingHold(entity); } } diff --git a/src/com/projectkorra/ProjectKorra/waterbending/Torrent.java b/src/com/projectkorra/ProjectKorra/waterbending/Torrent.java index 2c4ddec6..b1f2c79b 100644 --- a/src/com/projectkorra/ProjectKorra/waterbending/Torrent.java +++ b/src/com/projectkorra/ProjectKorra/waterbending/Torrent.java @@ -507,6 +507,7 @@ public class Torrent { damagedealt = (int) (Methods.getWaterbendingNightAugment(world) * (double) deflectdamage); } Methods.damageEntity(player, entity, damagedealt); + Methods.breakBreathbendingHold(entity); } } @@ -526,6 +527,7 @@ public class Torrent { } // if (((LivingEntity) entity).getNoDamageTicks() == 0) { Methods.damageEntity(player, entity, damagedealt); + Methods.breakBreathbendingHold(entity); // Methods.verbose("Hit! Health at " // + ((LivingEntity) entity).getHealth()); hurtentities.add(entity); diff --git a/src/com/projectkorra/ProjectKorra/waterbending/WaterManipulation.java b/src/com/projectkorra/ProjectKorra/waterbending/WaterManipulation.java index 93660404..51ad1c18 100644 --- a/src/com/projectkorra/ProjectKorra/waterbending/WaterManipulation.java +++ b/src/com/projectkorra/ProjectKorra/waterbending/WaterManipulation.java @@ -367,6 +367,7 @@ public class WaterManipulation { if (AvatarState.isAvatarState(player)) damage = AvatarState.getValue(damage); Methods.damageEntity(player, entity, (int) Methods.waterbendingNightAugment(damage, player.getWorld())); + Methods.breakBreathbendingHold(entity); progressing = false; // } } diff --git a/src/com/projectkorra/ProjectKorra/waterbending/Wave.java b/src/com/projectkorra/ProjectKorra/waterbending/Wave.java index c433cef0..ff980f69 100644 --- a/src/com/projectkorra/ProjectKorra/waterbending/Wave.java +++ b/src/com/projectkorra/ProjectKorra/waterbending/Wave.java @@ -304,6 +304,7 @@ public class Wave { if (entity.getFireTicks() > 0) entity.getWorld().playEffect(entity.getLocation(), Effect.EXTINGUISH, 0); entity.setFireTicks(0); + Methods.breakBreathbendingHold(entity); } } diff --git a/src/config.yml b/src/config.yml index aa199b5a..9b3716b7 100644 --- a/src/config.yml +++ b/src/config.yml @@ -138,7 +138,7 @@ Abilities: Speed: 25 Cooldown: 1500 ChargeFactor: 3 - Breathbending: + BreathSphere: Enabled: true CanBeUsedOnUndeadMobs: true Range: 5 diff --git a/src/plugin.yml b/src/plugin.yml index b05eb840..401438c2 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -51,7 +51,7 @@ permissions: bending.ability.AirSpout: true bending.ability.AirSuction: true bending.ability.AirSwipe: true - bending.ability.Breathbending: true + bending.ability.BreathSphere: true bending.ability.Tornado: true bending.air.passive: true bending.water: @@ -116,4 +116,4 @@ permissions: bending.chi.grapplinghook: true bending.avatar: default: false - description: Grants the Avatar Color. + description: Grants the Avatar Color. \ No newline at end of file From 2c7fd4c74fc87b0f77aabab5730bb0cc9fda48f7 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Sun, 24 Aug 2014 07:26:21 -0400 Subject: [PATCH 5/6] BreathSphere Description Added a description to BreathSphere. --- src/com/projectkorra/ProjectKorra/ConfigManager.java | 1 + src/config.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/src/com/projectkorra/ProjectKorra/ConfigManager.java b/src/com/projectkorra/ProjectKorra/ConfigManager.java index 1964d87e..3ee14fea 100644 --- a/src/com/projectkorra/ProjectKorra/ConfigManager.java +++ b/src/com/projectkorra/ProjectKorra/ConfigManager.java @@ -190,6 +190,7 @@ public class ConfigManager { config.addDefault("Abilities.Air.AirSwipe.ChargeFactor", 3); config.addDefault("Abilities.Air.BreathSphere.Enabled", true); + config.addDefault("Abilities.Air.BreathSphere.Description", "This ability is one of the most dangerous abilities an Airbender possesses. To use, simply look at an entity and hold shift. The entity will begin taking damage as you extract the air from their lungs. Any bender caught in this sphere will only be able to use basic moves, such as AirSwipe, WaterManipulation, FireBlast, or EarthBlast. An entity can be knocked out of the sphere by certain bending arts, and your attention will be disrupted if you are hit by bending."); config.addDefault("Abilities.Air.BreathSphere.CanBeUsedOnUndeadMobs", true); config.addDefault("Abilities.Air.BreathSphere.Range", 5); config.addDefault("Abilities.Air.BreathSphere.Damage", 0.5); diff --git a/src/config.yml b/src/config.yml index 9b3716b7..d0888583 100644 --- a/src/config.yml +++ b/src/config.yml @@ -140,6 +140,7 @@ Abilities: ChargeFactor: 3 BreathSphere: Enabled: true + Description: "This ability is one of the most dangerous abilities an Airbender possesses. To use, simply look at an entity and hold shift. The entity will begin taking damage as you extract the air from their lungs. Any bender caught in this sphere will only be able to use basic moves, such as AirSwipe, WaterManipulation, FireBlast, or EarthBlast. An entity can be knocked out of the sphere by certain bending arts, and your attention will be disrupted if you are hit by bending." CanBeUsedOnUndeadMobs: true Range: 5 Damage: 0.5 From b61657e35c5fafa1bfb1634a804b291f91aa7a10 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Sun, 24 Aug 2014 08:19:31 -0400 Subject: [PATCH 6/6] Added a FireworkEffectPlayer Added some methods to play Firework effects --- .../projectkorra/ProjectKorra/Methods.java | 10 +++ .../Utilities/FireworkEffectPlayer.java | 67 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 src/com/projectkorra/ProjectKorra/Utilities/FireworkEffectPlayer.java diff --git a/src/com/projectkorra/ProjectKorra/Methods.java b/src/com/projectkorra/ProjectKorra/Methods.java index ab880255..49b80cb5 100644 --- a/src/com/projectkorra/ProjectKorra/Methods.java +++ b/src/com/projectkorra/ProjectKorra/Methods.java @@ -28,7 +28,10 @@ import net.sacredlabyrinth.Phaed.PreciousStones.PreciousStones; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Color; import org.bukkit.Effect; +import org.bukkit.FireworkEffect; +import org.bukkit.FireworkEffect.Type; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; @@ -69,6 +72,7 @@ import com.palmergames.bukkit.towny.war.flagwar.TownyWarConfig; import com.projectkorra.ProjectKorra.Ability.AbilityModule; import com.projectkorra.ProjectKorra.Ability.AbilityModuleManager; import com.projectkorra.ProjectKorra.Ability.AvatarState; +import com.projectkorra.ProjectKorra.Utilities.FireworkEffectPlayer; import com.projectkorra.ProjectKorra.Utilities.ParticleEffect; import com.projectkorra.ProjectKorra.airbending.AirBlast; import com.projectkorra.ProjectKorra.airbending.AirBubble; @@ -1852,5 +1856,11 @@ public class Methods { } } } + + public static FireworkEffectPlayer fireworkeffectplayer = new FireworkEffectPlayer(); + + public static FireworkEffect customFireworkEffect(Type type, Color color) { + return FireworkEffect.builder().with(type).withColor(color).build(); + } } diff --git a/src/com/projectkorra/ProjectKorra/Utilities/FireworkEffectPlayer.java b/src/com/projectkorra/ProjectKorra/Utilities/FireworkEffectPlayer.java new file mode 100644 index 00000000..eaffe1d8 --- /dev/null +++ b/src/com/projectkorra/ProjectKorra/Utilities/FireworkEffectPlayer.java @@ -0,0 +1,67 @@ +package com.projectkorra.ProjectKorra.Utilities; + +import java.lang.reflect.Method; + +import org.bukkit.FireworkEffect; +import org.bukkit.entity.Firework; +import org.bukkit.inventory.meta.FireworkMeta; +import org.bukkit.Location; +import org.bukkit.World; + +/** + * FireworkEffectPlayer v1.0 + * + * FireworkEffectPlayer provides a thread-safe and (reasonably) version independant way to instantly explode a FireworkEffect at a given location. + * You are welcome to use, redistribute, modify and destroy your own copies of this source with the following conditions: + * + * 1. No warranty is given or implied. + * 2. All damage is your own responsibility. + * 3. You provide credit publicly to the original source should you release the plugin. + * + * @author codename_B + */ +public class FireworkEffectPlayer { + + private Method world_getHandle = null; + private Method nms_world_broadcastEntityEffect = null; + private Method firework_getHandle = null; + + public void playFirework(World world, Location loc, FireworkEffect fe) throws Exception { + Firework fw = (Firework) world.spawn(loc, Firework.class); + Object nms_world = null; + Object nms_firework = null; + if(world_getHandle == null) { + world_getHandle = getMethod(world.getClass(), "getHandle"); + firework_getHandle = getMethod(fw.getClass(), "getHandle"); + } + nms_world = world_getHandle.invoke(world, (Object[]) null); + nms_firework = firework_getHandle.invoke(fw, (Object[]) null); + if(nms_world_broadcastEntityEffect == null) { + nms_world_broadcastEntityEffect = getMethod(nms_world.getClass(), "broadcastEntityEffect"); + } + + FireworkMeta data = (FireworkMeta) fw.getFireworkMeta(); + + data.clearEffects(); + + data.setPower(1); + + data.addEffect(fe); + + fw.setFireworkMeta(data); + + nms_world_broadcastEntityEffect.invoke(nms_world, new Object[] {nms_firework, (byte) 17}); + + fw.remove(); + } + + private static Method getMethod(Class cl, String method) { + for(Method m : cl.getMethods()) { + if(m.getName().equals(method)) { + return m; + } + } + return null; + } + +} \ No newline at end of file