TF-ProjectKorra/src/com/projectkorra/projectkorra/command/DisplayCommand.java
Christopher Martin 75c4f41be5
1.9.2 (#1153)
## Additions
* Adds support for Minecraft 1.17!
* Adds vanished player support to the `/pk who <Player>` command.
  * Should work with most common vanishing plugins, tested using Essentials vanish.
  * Affects `/pk who` and `/pk who <Player>`.
* Adds new `"Abilities.Earth.EarthSmash.Lift.Knockup"` configuration option to control the velocity applied to players standing where an EarthSmash is created.
* Adds new `"Abilities.Earth.EarthSmash.Lift.Range"` configuration option to control the range in which entities need to be standing in relation to where an EarthSmash is created to get the Knockup applied.

## Fixes
* Fixes players sometimes "falling through" their EarthSmash if they try to create it underneath themselves.
  * Reduces the overall push so it feels more natural.
  * Expands the push radius so it can affect entities within one block of the location.
* Fixes IceWave activating sometimes when PhaseChange wasn't clicked.
* Fixes IceWave users getting stuck on their ice midair.
* Fixes the display command showing hidden combos and passives
* Fixes an error caused by adding attribute modifiers to abilities sometimes.
* Fixes an error preventing the plugin from working on Minecraft 1.17.
  * ClassDefNotFoundError resulting from EntityHuman being moved during the 1.17 Minecraft update. We no longer rely on NMS for this area as a proper API has been introduced. As such, GeneralMethods and EarthArmor have been updated to reflect these changes.
2021-06-15 09:49:50 -07:00

402 lines
14 KiB
Java

package com.projectkorra.projectkorra.command;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.projectkorra.projectkorra.BendingPlayer;
import com.projectkorra.projectkorra.Element;
import com.projectkorra.projectkorra.Element.SubElement;
import com.projectkorra.projectkorra.GeneralMethods;
import com.projectkorra.projectkorra.ability.AddonAbility;
import com.projectkorra.projectkorra.ability.ComboAbility;
import com.projectkorra.projectkorra.ability.CoreAbility;
import com.projectkorra.projectkorra.ability.SubAbility;
import com.projectkorra.projectkorra.ability.util.ComboManager;
import com.projectkorra.projectkorra.ability.util.PassiveManager;
import com.projectkorra.projectkorra.configuration.ConfigManager;
/**
* Executor for /bending display. Extends {@link PKCommand}.
*/
public class DisplayCommand extends PKCommand {
private final String noCombosAvailable;
private final String noPassivesAvailable;
private final String invalidArgument;
private final String playersOnly;
private final String noAbilitiesAvailable;
private final String noBinds;
public DisplayCommand() {
super("display", "/bending display <Element>", ConfigManager.languageConfig.get().getString("Commands.Display.Description"), new String[] { "display", "dis", "d" });
this.noCombosAvailable = ConfigManager.languageConfig.get().getString("Commands.Display.NoCombosAvailable");
this.noPassivesAvailable = ConfigManager.languageConfig.get().getString("Commands.Display.NoPassivesAvailable");
this.noAbilitiesAvailable = ConfigManager.languageConfig.get().getString("Commands.Display.NoAbilitiesAvailable");
this.invalidArgument = ConfigManager.languageConfig.get().getString("Commands.Display.InvalidArgument");
this.playersOnly = ConfigManager.languageConfig.get().getString("Commands.Display.PlayersOnly");
this.noBinds = ConfigManager.languageConfig.get().getString("Commands.Display.NoBinds");
}
@Override
public void execute(final CommandSender sender, final List<String> args) {
if (!this.hasPermission(sender) || !this.correctLength(sender, args.size(), 0, 1)) {
return;
}
// bending display [Element].
if (args.size() == 1) {
String elementName = args.get(0).toLowerCase().replace("bending", "");
if (elementName.equalsIgnoreCase("wc")) {
elementName = "watercombo";
} else if (elementName.equalsIgnoreCase("ac")) {
elementName = "aircombo";
} else if (elementName.equalsIgnoreCase("ec")) {
elementName = "earthcombo";
} else if (elementName.equalsIgnoreCase("fc")) {
elementName = "firecombo";
} else if (elementName.equalsIgnoreCase("cc")) {
elementName = "chicombo";
} else if (elementName.equalsIgnoreCase("avc")) {
elementName = "avatarcombo";
} else if (elementName.equalsIgnoreCase("wp")) {
elementName = "waterpassive";
} else if (elementName.equalsIgnoreCase("ap")) {
elementName = "airpassive";
} else if (elementName.equalsIgnoreCase("ep")) {
elementName = "earthpassive";
} else if (elementName.equalsIgnoreCase("fp")) {
elementName = "firepassive";
} else if (elementName.equalsIgnoreCase("cp")) {
elementName = "chipassive";
} else if (elementName.equalsIgnoreCase("avp")) {
elementName = "avatarpassive";
}
final Element element = Element.fromString(elementName.replace("combos", "").replace("combo", "").replace("passives", "").replace("passive", ""));
// combos.
if (elementName.contains("combo")) {
if (element == null) {
sender.sendMessage(ChatColor.BOLD + "Combos");
for (final Element e : Element.getAllElements()) {
final ChatColor color = e != null ? e.getColor() : null;
final ArrayList<String> combos = ComboManager.getCombosForElement(e);
for (final String comboAbil : combos) {
ChatColor comboColor = color;
if (!sender.hasPermission("bending.ability." + comboAbil)) {
continue;
}
final CoreAbility coreAbil = CoreAbility.getAbility(comboAbil);
if (coreAbil == null || coreAbil.isHiddenAbility()) {
continue;
}
comboColor = coreAbil.getElement().getColor();
String message = (comboColor + comboAbil);
if (coreAbil instanceof AddonAbility) {
message += ChatColor.WHITE + (ChatColor.BOLD + "*");
}
sender.sendMessage(message);
}
}
return;
} else {
final ChatColor color = element != null ? element.getColor() : null;
final ArrayList<String> combos = ComboManager.getCombosForElement(element);
if (combos.isEmpty()) {
GeneralMethods.sendBrandingMessage(sender, color + this.noCombosAvailable.replace("{element}", element.getName()));
return;
}
sender.sendMessage(element.getColor() + (ChatColor.BOLD + element.getName()) + element.getType().getBending() + ChatColor.WHITE + (ChatColor.BOLD + " Combos"));
for (final String comboMove : combos) {
ChatColor comboColor = color;
if (!sender.hasPermission("bending.ability." + comboMove)) {
continue;
}
final CoreAbility coreAbil = CoreAbility.getAbility(comboMove);
if (coreAbil == null || coreAbil.isHiddenAbility()) {
continue;
}
comboColor = coreAbil.getElement().getColor();
String message = (comboColor + comboMove);
if (coreAbil instanceof AddonAbility) {
message += ChatColor.WHITE + (ChatColor.BOLD + "*");
}
sender.sendMessage(message);
}
return;
}
// passives.
} else if (elementName.contains("passive")) {
if (element == null) {
sender.sendMessage(ChatColor.BOLD + "Passives");
for (final Element e : Element.getAllElements()) {
final ChatColor color = e != null ? e.getColor() : null;
final Set<String> passives = PassiveManager.getPassivesForElement(e);
for (final String passiveAbil : passives) {
ChatColor passiveColor = color;
if (!sender.hasPermission("bending.ability." + passiveAbil)) {
continue;
}
final CoreAbility coreAbil = CoreAbility.getAbility(passiveAbil);
if (coreAbil == null || coreAbil.isHiddenAbility()) {
continue;
}
passiveColor = coreAbil.getElement().getColor();
String message = (passiveColor + passiveAbil);
if (coreAbil instanceof AddonAbility) {
message += ChatColor.WHITE + (ChatColor.BOLD + "*");
}
sender.sendMessage(message);
}
}
return;
}
final ChatColor color = element != null ? element.getColor() : null;
final Set<String> passives = PassiveManager.getPassivesForElement(element);
if (passives.isEmpty()) {
GeneralMethods.sendBrandingMessage(sender, color + this.noPassivesAvailable.replace("{element}", element.getName()));
return;
}
sender.sendMessage(element.getColor() + (ChatColor.BOLD + element.getName()) + element.getType().getBending() + ChatColor.WHITE + (ChatColor.BOLD + " Passives"));
for (final String passiveAbil : passives) {
ChatColor passiveColor = color;
if (!sender.hasPermission("bending.ability." + passiveAbil)) {
continue;
}
final CoreAbility coreAbil = CoreAbility.getAbility(passiveAbil);
if (coreAbil == null || coreAbil.isHiddenAbility()) {
continue;
}
passiveColor = coreAbil.getElement().getColor();
sender.sendMessage(passiveColor + passiveAbil);
}
return;
} else if (element != null) {
if (!(element instanceof SubElement)) {
this.displayElement(sender, element);
} else {
this.displaySubElement(sender, (SubElement) element);
}
}
else {
final StringBuilder elements = new StringBuilder(ChatColor.RED + this.invalidArgument);
elements.append(ChatColor.WHITE + "\nElements: ");
for (final Element e : Element.getAllElements()) {
if (!(e instanceof SubElement)) {
elements.append(e.getColor() + e.getName() + ChatColor.WHITE + " | ");
}
}
sender.sendMessage(elements.toString());
final StringBuilder subelements = new StringBuilder(ChatColor.WHITE + "SubElements: ");
for (final SubElement e : Element.getAllSubElements()) {
subelements.append(ChatColor.WHITE + "\n- " + e.getColor() + e.getName());
}
sender.sendMessage(subelements.toString());
}
}
if (args.size() == 0) {
// bending display.
if (!(sender instanceof Player)) {
GeneralMethods.sendBrandingMessage(sender, ChatColor.RED + this.playersOnly);
return;
}
this.displayBinds(sender);
}
}
/**
* Displays the enabled moves for the given element to the CommandSender.
*
* @param sender The CommandSender to show the moves to
* @param element The element to show the moves for
*/
private void displayElement(final CommandSender sender, final Element element) {
final List<CoreAbility> abilities = CoreAbility.getAbilitiesByElement(element);
if (abilities.isEmpty()) {
sender.sendMessage(ChatColor.YELLOW + this.noAbilitiesAvailable.replace("{element}", element.getColor() + element.getName() + ChatColor.YELLOW));
return;
}
sender.sendMessage(element.getColor() + (ChatColor.BOLD + element.getName()) + element.getType().getBending());
final HashSet<String> abilitiesSent = new HashSet<String>(); // Some abilities have the same name. This prevents this from showing anything.
for (final CoreAbility ability : abilities) {
if (ability instanceof SubAbility || ability instanceof ComboAbility || ability.isHiddenAbility() || abilitiesSent.contains(ability.getName())) {
continue;
}
if (!(sender instanceof Player) || GeneralMethods.canView((Player) sender, ability.getName())) {
String message = ability.getElement().getColor() + ability.getName();
if (ability instanceof AddonAbility) {
message += ChatColor.WHITE + (ChatColor.BOLD + "*");
}
sender.sendMessage(message);
abilitiesSent.add(ability.getName());
}
}
if (element.equals(Element.CHI)) {
sender.sendMessage(ChatColor.YELLOW + "Combos: " + ChatColor.GOLD + "/bending display ChiCombos");
sender.sendMessage(ChatColor.YELLOW + "Passives: " + ChatColor.GOLD + "/bending display ChiPassives");
} else {
sender.sendMessage(element.getSubColor() + "Combos: " + element.getColor() + "/bending display " + element.toString() + "Combos");
sender.sendMessage(element.getSubColor() + "Passives: " + element.getColor() + "/bending display " + element.toString() + "Passives");
for (final SubElement sub : Element.getSubElements(element)) {
if (sender.hasPermission("bending." + element.getName().toLowerCase() + "." + sub.getName().toLowerCase())) {
sender.sendMessage(sub.toString() + " abilities: " + element.getColor() + "/bending display " + sub.toString());
}
}
}
}
/**
* Displays the enabled moves for the given subelement to the CommandSender.
*
* @param sender The CommandSender to show the moves to
* @param element The subelement to show the moves for
*/
private void displaySubElement(final CommandSender sender, final SubElement element) {
final List<CoreAbility> abilities = CoreAbility.getAbilitiesByElement(element);
if (abilities.isEmpty() && element != null) {
sender.sendMessage(ChatColor.YELLOW + this.noAbilitiesAvailable.replace("{element}", element.getColor() + element.getName() + ChatColor.YELLOW));
return;
}
sender.sendMessage(element.getColor() + (ChatColor.BOLD + element.getName()) + element.getType().getBending());
final HashSet<String> abilitiesSent = new HashSet<String>();
for (final CoreAbility ability : abilities) {
if (ability.isHiddenAbility() || abilitiesSent.contains(ability.getName())) {
continue;
} else if (!(sender instanceof Player) || GeneralMethods.canView((Player) sender, ability.getName())) {
String message = element.getColor() + ability.getName();
if (ability instanceof AddonAbility) {
message += ChatColor.WHITE + (ChatColor.BOLD + "*");
}
sender.sendMessage(message);
abilitiesSent.add(ability.getName());
}
}
sender.sendMessage(element.getParentElement().getColor() + "Passives: " + element.getColor() + "/bending display " + element.getName() + "Passives");
}
/**
* Displays a Player's bound abilities.
*
* @param sender The CommandSender to output the bound abilities to
*/
private void displayBinds(final CommandSender sender) {
BendingPlayer bPlayer = BendingPlayer.getBendingPlayer(sender.getName());
if (bPlayer == null) {
GeneralMethods.createBendingPlayer(((Player) sender).getUniqueId(), sender.getName());
bPlayer = BendingPlayer.getBendingPlayer(sender.getName());
}
final HashMap<Integer, String> abilities = bPlayer.getAbilities();
if (abilities.isEmpty()) {
sender.sendMessage(ChatColor.RED + this.noBinds);
return;
}
sender.sendMessage(ChatColor.WHITE + (ChatColor.BOLD + "Abilities"));
for (int i = 1; i <= 9; i++) {
final String ability = abilities.get(i);
final CoreAbility coreAbil = CoreAbility.getAbility(ability);
if (coreAbil != null && !ability.equalsIgnoreCase("null")) {
String message = i + ". " + coreAbil.getElement().getColor() + ability;
if (coreAbil instanceof AddonAbility) {
message += ChatColor.WHITE + (ChatColor.BOLD + "*");
}
sender.sendMessage(message);
}
}
}
@Override
protected List<String> getTabCompletion(final CommandSender sender, final List<String> args) {
if (args.size() >= 1 || !sender.hasPermission("bending.command.display")) {
return new ArrayList<String>();
}
final List<String> list = new ArrayList<String>();
list.add("Air");
list.add("Earth");
list.add("Fire");
list.add("Water");
list.add("Chi");
for (final Element e : Element.getAddonElements()) {
list.add(e.getName());
}
list.add("Bloodbending");
list.add("Combustion");
list.add("Flight");
list.add("Healing");
list.add("Ice");
list.add("Lava");
list.add("Lightning");
list.add("Metal");
list.add("Plantbending");
list.add("Sand");
list.add("Spiritual");
list.add("BlueFire");
for (final SubElement se : Element.getAddonSubElements()) {
list.add(se.getName());
}
list.add("AirCombos");
list.add("EarthCombos");
list.add("FireCombos");
list.add("WaterCombos");
list.add("ChiCombos");
list.add("Avatar");
list.add("AirPassives");
list.add("EarthPassives");
list.add("FirePassives");
list.add("WaterPassives");
list.add("ChiPassives");
return list;
}
}