diff --git a/src/com/projectkorra/projectkorra/GeneralMethods.java b/src/com/projectkorra/projectkorra/GeneralMethods.java index 0f5fd6b9..01158b26 100644 --- a/src/com/projectkorra/projectkorra/GeneralMethods.java +++ b/src/com/projectkorra/projectkorra/GeneralMethods.java @@ -1,68 +1,12 @@ package com.projectkorra.projectkorra; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.lang.reflect.Field; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - +import fr.neatmonster.nocheatplus.checks.CheckType; +import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager; import me.ryanhamshire.GriefPrevention.Claim; import me.ryanhamshire.GriefPrevention.GriefPrevention; import net.sacredlabyrinth.Phaed.PreciousStones.FieldFlag; import net.sacredlabyrinth.Phaed.PreciousStones.PreciousStones; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Sound; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.BlockState; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.FallingBlock; -import org.bukkit.entity.FallingSand; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.entity.TNTPrimed; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.PluginManager; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - import com.google.common.reflect.ClassPath; import com.griefcraft.lwc.LWC; import com.griefcraft.lwc.LWCPlugin; @@ -128,8 +72,63 @@ import com.projectkorra.projectkorra.waterbending.WaterSpout; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.flags.DefaultFlag; -import fr.neatmonster.nocheatplus.checks.CheckType; -import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.BlockState; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.FallingSand; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginManager; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.lang.reflect.Field; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; @SuppressWarnings("deprecation") public class GeneralMethods { @@ -1278,7 +1277,6 @@ public class GeneralMethods { return null; } - @SuppressWarnings("incomplete-switch") public static ChatColor getSubBendingColor(Element element) { switch (element) { case Fire: @@ -1289,8 +1287,13 @@ public class GeneralMethods { return ChatColor.valueOf(plugin.getConfig().getString("Properties.Chat.Colors.WaterSub")); case Earth: return ChatColor.valueOf(plugin.getConfig().getString("Properties.Chat.Colors.EarthSub")); + default: + return getAvatarColor(); } - return getAvatarColor(); + } + + public static SubElement getSubElementByString(String sub) { + return SubElement.getType(sub); } @SuppressWarnings("unused") diff --git a/src/com/projectkorra/projectkorra/PKListener.java b/src/com/projectkorra/projectkorra/PKListener.java index 8d40b980..4c9ee26f 100644 --- a/src/com/projectkorra/projectkorra/PKListener.java +++ b/src/com/projectkorra/projectkorra/PKListener.java @@ -1,6 +1,7 @@ package com.projectkorra.projectkorra; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Set; @@ -129,6 +130,7 @@ import com.projectkorra.projectkorra.firebending.Illumination; import com.projectkorra.projectkorra.firebending.Lightning; import com.projectkorra.projectkorra.firebending.RingOfFire; import com.projectkorra.projectkorra.firebending.WallOfFire; +import com.projectkorra.projectkorra.object.HorizontalVelocityTracker; import com.projectkorra.projectkorra.object.Preset; import com.projectkorra.projectkorra.util.BlockSource; import com.projectkorra.projectkorra.util.ClickType; @@ -933,7 +935,11 @@ public class PKListener implements Listener { } } */ - if (element != null) { + if (HorizontalVelocityTracker.hasBeenDamagedByHorizontalVelocity(event.getEntity()) && Arrays.asList(HorizontalVelocityTracker.abils).contains(tempAbility)) { + if (ConfigManager.deathMsgConfig.get().contains("HorizontalVelocity." + tempAbility)) { + message = ConfigManager.deathMsgConfig.get().getString("HorizontalVelocity." + tempAbility); + } + } else if (element != null) { if (ConfigManager.deathMsgConfig.get().contains(element.toString() + "." + tempAbility)) { message = ConfigManager.deathMsgConfig.get().getString(element + "." + tempAbility); } else if (ConfigManager.deathMsgConfig.get().contains("Combo." + tempAbility)) { diff --git a/src/com/projectkorra/projectkorra/SubElement.java b/src/com/projectkorra/projectkorra/SubElement.java index d47bc6b2..a47a151a 100644 --- a/src/com/projectkorra/projectkorra/SubElement.java +++ b/src/com/projectkorra/projectkorra/SubElement.java @@ -1,34 +1,38 @@ package com.projectkorra.projectkorra; -import java.util.Arrays; +import com.projectkorra.projectkorra.command.Commands; import org.bukkit.ChatColor; +import java.util.Arrays; + public enum SubElement { //Air - Flight (Element.Air), - SpiritualProjection (Element.Air), + Flight (Element.Air, Commands.flightaliases), + SpiritualProjection (Element.Air, Commands.spiritualprojectionaliases), //Water - Bloodbending (Element.Water), - Healing (Element.Water), - Icebending (Element.Water), - Plantbending (Element.Water), + Bloodbending (Element.Water, Commands.bloodaliases), + Healing (Element.Water, Commands.healingaliases), + Icebending (Element.Water, Commands.icealiases), + Plantbending (Element.Water, Commands.plantaliases), // Earth - Metalbending (Element.Earth), - Sandbending (Element.Earth), - Lavabending (Element.Earth), + Metalbending (Element.Earth, Commands.metalbendingaliases), + Sandbending (Element.Earth, Commands.sandbendingaliases), + Lavabending (Element.Earth, Commands.lavabendingaliases), // Fire - Combustion (Element.Fire), - Lightning (Element.Fire); + Combustion (Element.Fire, Commands.combustionaliases), + Lightning (Element.Fire, Commands.lightningaliases); private Element element; + private String[] aliases; - SubElement(Element mainElement) { + SubElement(Element mainElement, String[] aliases) { this.element = mainElement; + this.aliases = aliases; } /**Returns the main element associated with the subelement @@ -45,7 +49,7 @@ public enum SubElement { public static SubElement getType(String string) { for (SubElement se : SubElement.values()) { - if (se.toString().equalsIgnoreCase(string)) { + if (Arrays.asList(se.aliases).contains(string.toLowerCase())) { return se; } } diff --git a/src/com/projectkorra/projectkorra/airbending/AirBlast.java b/src/com/projectkorra/projectkorra/airbending/AirBlast.java index 9498eebd..3f07d776 100644 --- a/src/com/projectkorra/projectkorra/airbending/AirBlast.java +++ b/src/com/projectkorra/projectkorra/airbending/AirBlast.java @@ -69,7 +69,6 @@ public class AirBlast extends CoreAbility { private ArrayList affectedlevers = new ArrayList(); private ArrayList affectedentities = new ArrayList(); - @SuppressWarnings("unused") private AirBurst source = null; public AirBlast(Location location, Vector direction, Player player, double factorpush, AirBurst burst) { @@ -230,7 +229,10 @@ public class AirBlast extends CoreAbility { return; GeneralMethods.setVelocity(entity, velocity); - new HorizontalVelocityTracker(entity, player, 200l); + if (source != null) + new HorizontalVelocityTracker(entity, player, 200l, StockAbility.AirBurst); + else + new HorizontalVelocityTracker(entity, player, 200l, StockAbility.AirBlast); entity.setFallDistance(0); if (!isUser && entity instanceof Player) { new Flight((Player) entity, player); diff --git a/src/com/projectkorra/projectkorra/airbending/AirSuction.java b/src/com/projectkorra/projectkorra/airbending/AirSuction.java index 21525986..c79d2073 100644 --- a/src/com/projectkorra/projectkorra/airbending/AirSuction.java +++ b/src/com/projectkorra/projectkorra/airbending/AirSuction.java @@ -258,7 +258,7 @@ public class AirSuction extends CoreAbility { continue; } GeneralMethods.setVelocity(entity, velocity); - new HorizontalVelocityTracker(entity, player, 200l); + new HorizontalVelocityTracker(entity, player, 200l, StockAbility.AirSuction); entity.setFallDistance(0); if (entity.getEntityId() != player.getEntityId() && entity instanceof Player) { new Flight((Player) entity, player); diff --git a/src/com/projectkorra/projectkorra/command/Commands.java b/src/com/projectkorra/projectkorra/command/Commands.java index 3ecb2330..072e878e 100644 --- a/src/com/projectkorra/projectkorra/command/Commands.java +++ b/src/com/projectkorra/projectkorra/command/Commands.java @@ -36,7 +36,8 @@ public class Commands { public static String[] firealiases = { "fire", "f", "firebending", "firebender" }; public static String[] wateraliases = { "water", "w", "waterbending", "waterbender" }; public static String[] elementaliases = { "air", "a", "airbending", "airbender", "chi", "c", "chiblocking", "chiblocker", "earth", "e", "earthbending", "earthbender", "fire", "f", "firebending", "firebender", "water", "w", "waterbending", "waterbender" }; - + public static String[] avataraliases = { "avatar", "av", "avy", "aang", "korra" }; + /* * Combo Aliases */ diff --git a/src/com/projectkorra/projectkorra/command/DisplayCommand.java b/src/com/projectkorra/projectkorra/command/DisplayCommand.java index 1a89b3b1..50525502 100644 --- a/src/com/projectkorra/projectkorra/command/DisplayCommand.java +++ b/src/com/projectkorra/projectkorra/command/DisplayCommand.java @@ -5,6 +5,7 @@ import com.projectkorra.projectkorra.Element; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ProjectKorra; import com.projectkorra.projectkorra.SubElement; +import com.projectkorra.projectkorra.ability.AbilityModuleManager; import com.projectkorra.projectkorra.ability.combo.ComboManager; import com.projectkorra.projectkorra.airbending.AirMethods; import com.projectkorra.projectkorra.chiblocking.ChiMethods; @@ -67,6 +68,11 @@ public class DisplayCommand extends PKCommand { else if (Arrays.asList(Commands.subelementaliases).contains(element)) { displaySubElement(sender, element); } + + //avatar + else if (Arrays.asList(Commands.avataraliases).contains(element)) { + displayAvatar(sender); + } else { ChatColor w = ChatColor.WHITE; @@ -93,6 +99,24 @@ public class DisplayCommand extends PKCommand { displayBinds(sender); } } + + private void displayAvatar(CommandSender sender) { + List abilities = new ArrayList<>(); + for (String ability : AbilityModuleManager.abilities) { + if (!AbilityModuleManager.airbendingabilities.contains(ability) && !AbilityModuleManager.earthbendingabilities.contains(ability) && !AbilityModuleManager.firebendingabilities.contains(ability) && !AbilityModuleManager.waterbendingabilities.contains(ability) && !AbilityModuleManager.chiabilities.contains(ability)) { + abilities.add(ability); + } + } + if (abilities.isEmpty()) { + sender.sendMessage(ChatColor.YELLOW + "There are no " + GeneralMethods.getAvatarColor() + "avatar" + ChatColor.YELLOW + " abilities on this server!"); + return; + } + for (String ability : abilities) { + if (GeneralMethods.canView((Player) sender, ability)) { + sender.sendMessage(GeneralMethods.getAvatarColor() + ability); + } + } + } /** * Displays the enabled moves for the given element to the CommandSender. diff --git a/src/com/projectkorra/projectkorra/configuration/ConfigManager.java b/src/com/projectkorra/projectkorra/configuration/ConfigManager.java index b9b2589f..0d7823dd 100644 --- a/src/com/projectkorra/projectkorra/configuration/ConfigManager.java +++ b/src/com/projectkorra/projectkorra/configuration/ConfigManager.java @@ -66,6 +66,11 @@ public class ConfigManager { config.addDefault("Combo.JetBlaze", "{victim} was blasted away by {attacker}'s {ability}"); config.addDefault("Combo.FireWheel", "{victim} was incinerated by {attacker}'s {ability}"); config.addDefault("Combo.IceBullets", "{victim}'s heart was frozen by {attacker}'s {ability}"); + + config.addDefault("HorizontalVelocity.AirBlast","{victim} experienced kinetic damage by {attacker}'s {ability}"); + config.addDefault("HorizontalVelocity.AirBurst","{victim} experienced kinetic damage by {attacker}'s {ability}"); + config.addDefault("HorizontalVelocity.AirSuction","{victim} experienced kinetic damage by {attacker}'s {ability}"); + config.addDefault("HorizontalVelocity.Bloodbending","{victim} experienced kinetic damage by {attacker}'s {ability}"); deathMsgConfig.save(); break; diff --git a/src/com/projectkorra/projectkorra/event/HorizontalVelocityChangeEvent.java b/src/com/projectkorra/projectkorra/event/HorizontalVelocityChangeEvent.java index ec24ace2..cef182bc 100644 --- a/src/com/projectkorra/projectkorra/event/HorizontalVelocityChangeEvent.java +++ b/src/com/projectkorra/projectkorra/event/HorizontalVelocityChangeEvent.java @@ -1,5 +1,7 @@ package com.projectkorra.projectkorra.event; +import com.projectkorra.projectkorra.ability.StockAbility; + import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -12,6 +14,7 @@ import org.bukkit.util.Vector; * Created by Carbogen on 2/2/2015. */ public class HorizontalVelocityChangeEvent extends Event implements Cancellable { + private static final HandlerList handlers = new HandlerList(); private boolean isCancelled; @@ -23,6 +26,7 @@ public class HorizontalVelocityChangeEvent extends Event implements Cancellable private Vector difference; private Location start; private Location end; + private StockAbility abil; @Deprecated public HorizontalVelocityChangeEvent(Entity entity, Player instigator, Vector from, Vector to, Vector difference) { @@ -33,7 +37,7 @@ public class HorizontalVelocityChangeEvent extends Event implements Cancellable this.difference = difference; } - public HorizontalVelocityChangeEvent(Entity entity, Player instigator, Vector from, Vector to, Vector difference, Location start, Location end) { + public HorizontalVelocityChangeEvent(Entity entity, Player instigator, Vector from, Vector to, Vector difference, Location start, Location end, StockAbility ability ) { this.entity = entity; this.instigator = instigator; this.from = from; @@ -41,6 +45,7 @@ public class HorizontalVelocityChangeEvent extends Event implements Cancellable this.difference = difference; this.start = start; this.end = end; + abil = ability; } public Entity getEntity() { @@ -74,6 +79,10 @@ public class HorizontalVelocityChangeEvent extends Event implements Cancellable public Vector getDifference() { return difference; } + + public StockAbility getAbility() { + return abil; + } @Override public HandlerList getHandlers() { diff --git a/src/com/projectkorra/projectkorra/object/HorizontalVelocityTracker.java b/src/com/projectkorra/projectkorra/object/HorizontalVelocityTracker.java index cbb62cdd..2bfbe08e 100644 --- a/src/com/projectkorra/projectkorra/object/HorizontalVelocityTracker.java +++ b/src/com/projectkorra/projectkorra/object/HorizontalVelocityTracker.java @@ -2,6 +2,7 @@ package com.projectkorra.projectkorra.object; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ProjectKorra; +import com.projectkorra.projectkorra.ability.StockAbility; import com.projectkorra.projectkorra.earthbending.EarthMethods; import com.projectkorra.projectkorra.event.HorizontalVelocityChangeEvent; import com.projectkorra.projectkorra.waterbending.WaterMethods; @@ -20,8 +21,9 @@ import java.util.concurrent.ConcurrentHashMap; * Created by Carbogen on 2/2/2015. */ public class HorizontalVelocityTracker { + public static ConcurrentHashMap instances = new ConcurrentHashMap(); - + public boolean hasBeenDamaged = false; private long delay; private long fireTime; private Entity entity; @@ -30,8 +32,11 @@ public class HorizontalVelocityTracker { private Vector thisVelocity; private Location launchLocation; private Location impactLocation; + private StockAbility abil; + + public static String[] abils = {"AirBlast", "AirBurst", "AirSuction", "Bloodbending"}; - public HorizontalVelocityTracker(Entity e, Player instigator, long delay) { + public HorizontalVelocityTracker(Entity e, Player instigator, long delay, StockAbility ability) { remove(e); entity = e; this.instigator = instigator; @@ -41,6 +46,7 @@ public class HorizontalVelocityTracker { launchLocation = e.getLocation().clone(); impactLocation = launchLocation.clone(); this.delay = delay; + abil = ability; update(); instances.put(entity, this); } @@ -70,7 +76,8 @@ public class HorizontalVelocityTracker { for (Block b : blocks) { if (GeneralMethods.isSolid(b) && (entity.getLocation().getBlock().getRelative(BlockFace.EAST, 1).equals(b) || entity.getLocation().getBlock().getRelative(BlockFace.NORTH, 1).equals(b) || entity.getLocation().getBlock().getRelative(BlockFace.WEST, 1).equals(b) || entity.getLocation().getBlock().getRelative(BlockFace.SOUTH, 1).equals(b))) { if (!EarthMethods.isTransparentToEarthbending(instigator, b)) { - ProjectKorra.plugin.getServer().getPluginManager().callEvent(new HorizontalVelocityChangeEvent(entity, instigator, lastVelocity, thisVelocity, diff, launchLocation, impactLocation)); + ProjectKorra.plugin.getServer().getPluginManager().callEvent(new HorizontalVelocityChangeEvent(entity, instigator, lastVelocity, thisVelocity, diff, launchLocation, impactLocation, abil)); + hasBeenDamaged = true; remove(); return; } @@ -93,4 +100,11 @@ public class HorizontalVelocityTracker { if (instances.containsKey(e)) instances.remove(e); } + + public static boolean hasBeenDamagedByHorizontalVelocity(Entity e) { + if (instances.containsKey(e)) { + return instances.get(e).hasBeenDamaged; + } + return false; + } } diff --git a/src/com/projectkorra/projectkorra/waterbending/Bloodbending.java b/src/com/projectkorra/projectkorra/waterbending/Bloodbending.java index d4932df1..38848562 100644 --- a/src/com/projectkorra/projectkorra/waterbending/Bloodbending.java +++ b/src/com/projectkorra/projectkorra/waterbending/Bloodbending.java @@ -4,6 +4,7 @@ import com.projectkorra.projectkorra.BendingPlayer; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ProjectKorra; import com.projectkorra.projectkorra.ability.AvatarState; +import com.projectkorra.projectkorra.ability.StockAbility; import com.projectkorra.projectkorra.airbending.AirMethods; import com.projectkorra.projectkorra.firebending.FireMethods; import com.projectkorra.projectkorra.object.HorizontalVelocityTracker; @@ -117,7 +118,7 @@ public class Bloodbending { Vector vector = GeneralMethods.getDirection(location, GeneralMethods.getTargetedLocation(player, location.distance(target))); vector.normalize(); entity.setVelocity(vector.multiply(factor)); - new HorizontalVelocityTracker(entity, player, 200); + new HorizontalVelocityTracker(entity, player, 200, StockAbility.Bloodbending); } remove(player); } diff --git a/src/com/projectkorra/projectkorra/waterbending/OctopusForm.java b/src/com/projectkorra/projectkorra/waterbending/OctopusForm.java index 4b4489c4..134ae1f4 100644 --- a/src/com/projectkorra/projectkorra/waterbending/OctopusForm.java +++ b/src/com/projectkorra/projectkorra/waterbending/OctopusForm.java @@ -146,7 +146,7 @@ public class OctopusForm { double knock = AvatarState.isAvatarState(player) ? AvatarState.getValue(knockback) : knockback; entity.setVelocity(GeneralMethods.getDirection(player.getLocation(), location).normalize().multiply(knock)); if (entity instanceof LivingEntity) - GeneralMethods.damageEntity(player, entity, damage, "OctoposForm"); + GeneralMethods.damageEntity(player, entity, damage, "OctopusForm"); AirMethods.breakBreathbendingHold(entity); } }