diff --git a/lib/ProtocolLib.jar b/lib/ProtocolLib.jar new file mode 100644 index 0000000..74682ff Binary files /dev/null and b/lib/ProtocolLib.jar differ diff --git a/lib/lombok.jar b/lib/lombok.jar new file mode 100644 index 0000000..57ca614 Binary files /dev/null and b/lib/lombok.jar differ diff --git a/lib/mongo-java-driver-3.12.3.jar b/lib/mongo-java-driver-3.12.3.jar new file mode 100644 index 0000000..2100b5c Binary files /dev/null and b/lib/mongo-java-driver-3.12.3.jar differ diff --git a/lib/server.jar b/lib/server.jar new file mode 100644 index 0000000..e43ea1c Binary files /dev/null and b/lib/server.jar differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..ae9e472 --- /dev/null +++ b/pom.xml @@ -0,0 +1,83 @@ + + + 4.0.0 + + + clean install + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.1 + + + package + + shade + + + + + + + + + + dmulloy2-repo + http://repo.dmulloy2.net/nexus/repository/public/ + + + + + + org.projectlombok + lombok + 1.18.8 + provided + + + org.spigotmc + spigot + 1.8.8-R0.1-SNAPSHOT + system + ${project.basedir}/lib/server.jar + + + com.comphenix.protocol + ProtocolLib + 4.4.0 + provided + + + org.mongodb + mongo-java-driver + 3.11.0 + compile + + + org.mongodb + bson + 3.10.2 + compile + + + + + + me.abhi.practice + mPractice + 1.0-SNAPSHOT + + + \ No newline at end of file diff --git a/src/main/java/me/abhi/practice/PracticePlugin.java b/src/main/java/me/abhi/practice/PracticePlugin.java new file mode 100644 index 0000000..e116dcd --- /dev/null +++ b/src/main/java/me/abhi/practice/PracticePlugin.java @@ -0,0 +1,150 @@ +package me.abhi.practice; + +import lombok.Getter; +import me.abhi.practice.command.CommandFramework; +import me.abhi.practice.command.impl.hybrid.EventCommand; +import me.abhi.practice.command.impl.management.BuilderCommand; +import me.abhi.practice.command.impl.management.SetEditorCommand; +import me.abhi.practice.command.impl.management.SetSpawnCommand; +import me.abhi.practice.command.impl.management.arena.ArenaCommand; +import me.abhi.practice.command.impl.management.kit.KitCommand; +import me.abhi.practice.command.impl.management.kit.hcf.SetArcherKitCommand; +import me.abhi.practice.command.impl.management.kit.hcf.SetBardKitCommand; +import me.abhi.practice.command.impl.management.kit.hcf.SetDiamondKitCommand; +import me.abhi.practice.command.impl.management.kit.hcf.SetRogueKitCommand; +import me.abhi.practice.command.impl.player.*; +import me.abhi.practice.command.impl.player.time.DayCommand; +import me.abhi.practice.command.impl.player.time.NightCommand; +import me.abhi.practice.command.impl.player.time.SunsetCommand; +import me.abhi.practice.command.impl.staff.SetEloCommand; +import me.abhi.practice.command.impl.staff.SilentCommand; +import me.abhi.practice.command.impl.staff.TournamentCommand; +import me.abhi.practice.listener.PacketListener; +import me.abhi.practice.listener.PlayerListener; +import me.abhi.practice.listener.hcf.ArcherListener; +import me.abhi.practice.listener.hcf.BardListener; +import me.abhi.practice.listener.hcf.RogueListener; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.task.*; +import me.abhi.practice.task.player.ArcherMarkTask; +import me.abhi.practice.task.player.RogueBackstabTask; +import me.abhi.practice.util.misc.BlankObject; +import me.abhi.practice.util.misc.EntityHider; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.event.Listener; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Arrays; + +@Getter +public class PracticePlugin extends JavaPlugin { + + @Getter + private static PracticePlugin instance; + + private EntityHider entityHider; + private ManagerHandler managerHandler; + + + + @Override + public void onEnable() { + instance = this; + + getConfig().options().copyDefaults(true); + saveConfig(); + + managerHandler = new ManagerHandler(this); + managerHandler.register(); + + registerCommands( + new SetSpawnCommand(this), + new SetEditorCommand(this), + new KitCommand(this), + new ArenaCommand(this), + new SpawnCommand(this), + new InventoryCommand(this), + new PartyCommand(this), + new DayCommand(), + new SunsetCommand(), + new NightCommand(), + new DuelCommand(this), + new LeaderboardsCommand(this), + new AcceptCommand(this), + new SetDiamondKitCommand(), + new SetArcherKitCommand(), + new SetBardKitCommand(), + new SetRogueKitCommand(), + new EventCommand(this), + (this.getConfig().getBoolean("scoreboard.enabled") ? new ToggleScoreboardCommand(this) : new BlankObject()), // Disable /togglescoreboard when scoreboard option is disabledm + new TournamentCommand(this), + new SpectateCommand(this), + new SilentCommand(this), + new BuilderCommand(this), + new ToggleDuelRequestsCommand(this), + new SetEloCommand(this), + (this.getConfig().getBoolean("settings.settings-gui") ? new SettingsCommand(this) : new BlankObject()) + ); + + registerListeners( + new PlayerListener(this), + new PacketListener(this), + new BardListener(this), + new ArcherListener(this), + new RogueListener(this) + ); + entityHider = new EntityHider(this, EntityHider.Policy.BLACKLIST); + + registerTasks( + new InventoryTask(this), + new ScoreboardTask(this), + new WorldTask(this), + new ArcherMarkTask(this), + new RogueBackstabTask(this) + ); + new EnderpearlTask(this).runTaskTimerAsynchronously(this, 1L, 1L); // registered separately because of different timing + new MongoTask(this).runTaskTimerAsynchronously(this, 2400, 2400); // save player data every 2 mins + + this.getServer().getWorlds().stream().forEach(w -> { + w.setTime(6000L); + }); + + disableGameRules( + "doDaylightCycle", + "doMobSpawning", + "doFireTick"); + + } + + @Override + public void onDisable() { + this.getServer().getOnlinePlayers().stream().forEach(p -> p.kickPlayer("Server restarting.")); + managerHandler.getSettingsManager().save(); + managerHandler.getKitManager().save(); + managerHandler.getArenaManager().save(); + managerHandler.getEventManager().save(); + + this.getServer().getWorlds().forEach(w -> { + w.getEntities().stream().filter(e -> e.getType() == EntityType.DROPPED_ITEM).forEach(Entity::remove); + }); + } + + private void registerCommands(Object... objects) { + CommandFramework commandFramework = new CommandFramework(this); + Arrays.stream(objects).forEach(o -> commandFramework.registerCommands(o)); + } + + private void registerListeners(Listener... listeners) { + Arrays.stream(listeners).forEach(l -> getServer().getPluginManager().registerEvents(l, this)); + } + + private void registerTasks(BukkitRunnable... bukkitRunnables) { + Arrays.stream(bukkitRunnables).forEach(br -> br.runTaskTimerAsynchronously(this, 0L, 0L)); + } + + private void disableGameRules(String... gameRules) { + Arrays.stream(gameRules).forEach(gr -> this.getServer().getWorlds().stream().forEach(w -> w.setGameRuleValue(gr, "false"))); + } +} diff --git a/src/main/java/me/abhi/practice/arena/Arena.java b/src/main/java/me/abhi/practice/arena/Arena.java new file mode 100644 index 0000000..f22f300 --- /dev/null +++ b/src/main/java/me/abhi/practice/arena/Arena.java @@ -0,0 +1,18 @@ +package me.abhi.practice.arena; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import me.abhi.practice.kit.KitType; +import org.bukkit.Location; + +@Getter +@Setter +@RequiredArgsConstructor +public class Arena { + + private final String name; + private Location l1; + private Location l2; + private KitType kitType = KitType.NORMAL; +} diff --git a/src/main/java/me/abhi/practice/command/BukkitCommand.java b/src/main/java/me/abhi/practice/command/BukkitCommand.java new file mode 100644 index 0000000..af56860 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/BukkitCommand.java @@ -0,0 +1,98 @@ +package me.abhi.practice.command; + +import org.apache.commons.lang.Validate; +import org.bukkit.command.CommandException; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.plugin.Plugin; + +import java.util.List; + +/** + * Command Framework - BukkitCommand
+ * An implementation of Bukkit's Command class allowing for registering of + * commands without plugin.yml + * + * @author minnymin3 + */ +public class BukkitCommand extends org.bukkit.command.Command { + + private final Plugin owningPlugin; + protected BukkitCompleter completer; + private CommandExecutor executor; + + /** + * A slimmed down PluginCommand + * + * @param name + * @param owner + */ + protected BukkitCommand(String label, CommandExecutor executor, Plugin owner) { + super(label); + this.executor = executor; + this.owningPlugin = owner; + this.usageMessage = ""; + } + + @Override + public boolean execute(CommandSender sender, String commandLabel, String[] args) { + boolean success = false; + + if (!owningPlugin.isEnabled()) { + return false; + } + + if (!testPermission(sender)) { + return true; + } + + try { + success = executor.onCommand(sender, this, commandLabel, args); + } catch (Throwable ex) { + throw new CommandException("Unhandled exception executing command '" + commandLabel + "' in plugin " + + owningPlugin.getDescription().getFullName(), ex); + } + + if (!success && usageMessage.length() > 0) { + for (String line : usageMessage.replace("", commandLabel).split("\n")) { + sender.sendMessage(line); + } + } + + return success; + } + + @Override + public List tabComplete(CommandSender sender, String alias, String[] args) + throws CommandException, IllegalArgumentException { + Validate.notNull(sender, "Sender cannot be null"); + Validate.notNull(args, "Arguments cannot be null"); + Validate.notNull(alias, "Alias cannot be null"); + + List completions = null; + try { + if (completer != null) { + completions = completer.onTabComplete(sender, this, alias, args); + } + if (completions == null && executor instanceof TabCompleter) { + completions = ((TabCompleter) executor).onTabComplete(sender, this, alias, args); + } + } catch (Throwable ex) { + StringBuilder message = new StringBuilder(); + message.append("Unhandled exception during tab completion for command '/").append(alias).append(' '); + for (String arg : args) { + message.append(arg).append(' '); + } + message.deleteCharAt(message.length() - 1).append("' in plugin ") + .append(owningPlugin.getDescription().getFullName()); + throw new CommandException(message.toString(), ex); + } + + if (completions == null) { + return super.tabComplete(sender, alias, args); + } + return completions; + } + +} diff --git a/src/main/java/me/abhi/practice/command/BukkitCompleter.java b/src/main/java/me/abhi/practice/command/BukkitCompleter.java new file mode 100644 index 0000000..a731a7c --- /dev/null +++ b/src/main/java/me/abhi/practice/command/BukkitCompleter.java @@ -0,0 +1,58 @@ +package me.abhi.practice.command; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.AbstractMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Command Framework - BukkitCompleter
+ * An implementation of the TabCompleter class allowing for multiple tab + * completers per command + * + * @author minnymin3 + */ +public class BukkitCompleter implements TabCompleter { + + private Map> completers = new HashMap>(); + + public void addCompleter(String label, Method m, Object obj) { + completers.put(label, new AbstractMap.SimpleEntry(m, obj)); + } + + @SuppressWarnings("unchecked") + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + for (int i = args.length; i >= 0; i--) { + StringBuffer buffer = new StringBuffer(); + buffer.append(label.toLowerCase()); + for (int x = 0; x < i; x++) { + if (!args[x].equals("") && !args[x].equals(" ")) { + buffer.append("." + args[x].toLowerCase()); + } + } + String cmdLabel = buffer.toString(); + if (completers.containsKey(cmdLabel)) { + Entry entry = completers.get(cmdLabel); + try { + return (List) entry.getKey().invoke(entry.getValue(), + new CommandArgs(sender, command, label, args, cmdLabel.split("\\.").length - 1)); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + } + return null; + } + +} \ No newline at end of file diff --git a/src/main/java/me/abhi/practice/command/Command.java b/src/main/java/me/abhi/practice/command/Command.java new file mode 100644 index 0000000..92d9ccd --- /dev/null +++ b/src/main/java/me/abhi/practice/command/Command.java @@ -0,0 +1,71 @@ +package me.abhi.practice.command; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Command Framework - Command
+ * The command annotation used to designate methods as commands. All methods + * should have a single CommandArgs argument + * + * @author minnymin3 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Command { + + /** + * The name of the command. If it is a sub command then its values would be + * separated by periods. ie. a command that would be a subcommand of test + * would be 'test.subcommandname' + * + * @return + */ + public String name(); + + /** + * Gets the required permission of the command + * + * @return + */ + public String permission() default ""; + + /** + * The message sent to the profile when they do not have permission to + * execute it + * + * @return + */ + public String noPerm() default "You do not have permission to perform that action."; + + /** + * A list of alternate names that the command is executed under. See + * name() for details on how names work + * + * @return + */ + public String[] aliases() default {}; + + /** + * The description that will appear in /help of the command + * + * @return + */ + public String description() default ""; + + /** + * The usage that will appear in /help (commandname) + * + * @return + */ + public String usage() default ""; + + /** + * Whether or not the command is available to players only + * + * @return + */ + public boolean inGameOnly() default false; +} diff --git a/src/main/java/me/abhi/practice/command/CommandArgs.java b/src/main/java/me/abhi/practice/command/CommandArgs.java new file mode 100644 index 0000000..60f3ecc --- /dev/null +++ b/src/main/java/me/abhi/practice/command/CommandArgs.java @@ -0,0 +1,108 @@ +package me.abhi.practice.command; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +/** + * Command Framework - CommandArgs
+ * This class is passed to the command methods and contains various utilities as + * well as the command info. + * + * @author minnymin3 + */ +public class CommandArgs { + + private CommandSender sender; + private org.bukkit.command.Command command; + private String label; + private String[] args; + + protected CommandArgs(CommandSender sender, org.bukkit.command.Command command, String label, String[] args, + int subCommand) { + String[] modArgs = new String[args.length - subCommand]; + for (int i = 0; i < args.length - subCommand; i++) { + modArgs[i] = args[i + subCommand]; + } + + StringBuffer buffer = new StringBuffer(); + buffer.append(label); + for (int x = 0; x < subCommand; x++) { + buffer.append("." + args[x]); + } + String cmdLabel = buffer.toString(); + this.sender = sender; + this.command = command; + this.label = cmdLabel; + this.args = modArgs; + } + + /** + * Gets the command sender + * + * @return + */ + public CommandSender getSender() { + return sender; + } + + /** + * Gets the original command object + * + * @return + */ + public org.bukkit.command.Command getCommand() { + return command; + } + + /** + * Gets the label including sub command labels of this command + * + * @return Something like 'test.subcommand' + */ + public String getLabel() { + return label.replace(".", " "); + } + + /** + * Gets all the arguments after the command's label. ie. if the command + * label was test.subcommand and the arguments were subcommand foo foo, it + * would only return 'foo foo' because 'subcommand' is part of the command + * + * @return + */ + public String[] getArgs() { + return args; + } + + /** + * Gets the argument at the specified index + * + * @param index The index to get + * @return The string at the specified index + */ + public String getArgs(int index) { + return args[index]; + } + + /** + * Returns the length of the command arguments + * + * @return int length of args + */ + public int length() { + return args.length; + } + + public boolean isPlayer() { + return sender instanceof Player; + } + + public Player getPlayer() { + if (sender instanceof Player) { + return (Player) sender; + } else { + return null; + } + } + +} diff --git a/src/main/java/me/abhi/practice/command/CommandFramework.java b/src/main/java/me/abhi/practice/command/CommandFramework.java new file mode 100644 index 0000000..8f8b48a --- /dev/null +++ b/src/main/java/me/abhi/practice/command/CommandFramework.java @@ -0,0 +1,218 @@ +package me.abhi.practice.command; + +import me.abhi.practice.util.misc.CC; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandMap; +import org.bukkit.command.CommandSender; +import org.bukkit.command.PluginCommand; +import org.bukkit.entity.Player; +import org.bukkit.help.GenericCommandHelpTopic; +import org.bukkit.help.HelpTopic; +import org.bukkit.help.HelpTopicComparator; +import org.bukkit.help.IndexHelpTopic; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.SimplePluginManager; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; +import java.util.Map.Entry; + +/** + * Command Framework - CommandFramework
+ * The main command framework class used for controlling the framework. + * + * @author minnymin3 + */ +public class CommandFramework implements CommandExecutor { + + private Map> commandMap = new HashMap>(); + private CommandMap map; + private Plugin plugin; + + /** + * Initializes the command framework and sets up the command maps + */ + public CommandFramework(Plugin plugin) { + this.plugin = plugin; + if (plugin.getServer().getPluginManager() instanceof SimplePluginManager) { + SimplePluginManager manager = (SimplePluginManager) plugin.getServer().getPluginManager(); + try { + Field field = SimplePluginManager.class.getDeclaredField("commandMap"); + field.setAccessible(true); + map = (CommandMap) field.get(manager); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + } + } + + public boolean onCommand(CommandSender sender, org.bukkit.command.Command cmd, String label, String[] args) { + return handleCommand(sender, cmd, label, args); + } + + /** + * Handles commands. Used in the onCommand method in your JavaPlugin class + *` + * @param sender The {@link CommandSender} parsed from + * onCommand + * @param cmd The {@link org.bukkit.command.Command} parsed from onCommand + * @param label The label parsed from onCommand + * @param args The arguments parsed from onCommand + * @return Always returns true for simplicity's sake in onCommand + */ + public boolean handleCommand(CommandSender sender, org.bukkit.command.Command cmd, String label, String[] args) { + for (int i = args.length; i >= 0; i--) { + StringBuffer buffer = new StringBuffer(); + buffer.append(label.toLowerCase()); + for (int x = 0; x < i; x++) { + buffer.append("." + args[x].toLowerCase()); + } + String cmdLabel = buffer.toString(); + if (commandMap.containsKey(cmdLabel)) { + Method method = commandMap.get(cmdLabel).getKey(); + Object methodObject = commandMap.get(cmdLabel).getValue(); + Command command = method.getAnnotation(Command.class); + if (!command.permission().equalsIgnoreCase("") && !sender.hasPermission(command.permission())) { + sender.sendMessage(CC.RED + command.noPerm()); + return true; + } + if (command.inGameOnly() && !(sender instanceof Player)) { + sender.sendMessage("This command is only performable in game"); + return true; + } + try { + method.invoke(methodObject, new CommandArgs(sender, cmd, label, args, + cmdLabel.split("\\.").length - 1)); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return true; + } + } + defaultCommand(new CommandArgs(sender, cmd, label, args, 0)); + return true; + } + + /** + * Registers all command and completer methods inside of the object. Similar + * to Bukkit's registerEvents method. + * + * @param obj The object to register the commands of + */ + public void registerCommands(Object obj) { + for (Method m : obj.getClass().getMethods()) { + if (m.getAnnotation(Command.class) != null) { + Command command = m.getAnnotation(Command.class); + if (m.getParameterTypes().length > 1 || m.getParameterTypes()[0] != CommandArgs.class) { + System.out.println("Unable to register command " + m.getName() + ". Unexpected method arguments"); + continue; + } + registerCommand(command, command.name(), m, obj); + for (String alias : command.aliases()) { + registerCommand(command, alias, m, obj); + } + } else if (m.getAnnotation(Completer.class) != null) { + Completer comp = m.getAnnotation(Completer.class); + if (m.getParameterTypes().length > 1 || m.getParameterTypes().length == 0 + || m.getParameterTypes()[0] != CommandArgs.class) { + System.out.println("Unable to register tab completer " + m.getName() + + ". Unexpected method arguments"); + continue; + } + if (m.getReturnType() != List.class) { + System.out.println("Unable to register tab completer " + m.getName() + ". Unexpected return type"); + continue; + } + registerCompleter(comp.name(), m, obj); + for (String alias : comp.aliases()) { + registerCompleter(alias, m, obj); + } + } + } + } + + /** + * Registers all the commands under the plugin's help + */ + public void registerHelp() { + Set help = new TreeSet(HelpTopicComparator.helpTopicComparatorInstance()); + for (String s : commandMap.keySet()) { + if (!s.contains(".")) { + org.bukkit.command.Command cmd = map.getCommand(s); + HelpTopic topic = new GenericCommandHelpTopic(cmd); + help.add(topic); + } + } + IndexHelpTopic topic = new IndexHelpTopic(plugin.getName(), "All commands for " + plugin.getName(), null, help, + "Below is a list of all " + plugin.getName() + " commands:"); + Bukkit.getServer().getHelpMap().addTopic(topic); + } + + public void registerCommand(Command command, String label, Method m, Object obj) { + commandMap.put(label.toLowerCase(), new AbstractMap.SimpleEntry(m, obj)); + commandMap.put(this.plugin.getName() + ':' + label.toLowerCase(), new AbstractMap.SimpleEntry(m, obj)); + String cmdLabel = label.split("\\.")[0].toLowerCase(); + if (map.getCommand(cmdLabel) == null) { + org.bukkit.command.Command cmd = new BukkitCommand(cmdLabel, this, plugin); + map.register(plugin.getName(), cmd); + } + if (!command.description().equalsIgnoreCase("") && cmdLabel == label) { + map.getCommand(cmdLabel).setDescription(command.description()); + } + if (!command.usage().equalsIgnoreCase("") && cmdLabel == label) { + map.getCommand(cmdLabel).setUsage(command.usage()); + } + } + + public void registerCompleter(String label, Method m, Object obj) { + String cmdLabel = label.split("\\.")[0].toLowerCase(); + if (map.getCommand(cmdLabel) == null) { + org.bukkit.command.Command command = new BukkitCommand(cmdLabel, this, plugin); + map.register(plugin.getName(), command); + } + if (map.getCommand(cmdLabel) instanceof BukkitCommand) { + BukkitCommand command = (BukkitCommand) map.getCommand(cmdLabel); + if (command.completer == null) { + command.completer = new BukkitCompleter(); + } + command.completer.addCompleter(label, m, obj); + } else if (map.getCommand(cmdLabel) instanceof PluginCommand) { + try { + Object command = map.getCommand(cmdLabel); + Field field = command.getClass().getDeclaredField("completer"); + field.setAccessible(true); + if (field.get(command) == null) { + BukkitCompleter completer = new BukkitCompleter(); + completer.addCompleter(label, m, obj); + field.set(command, completer); + } else if (field.get(command) instanceof BukkitCompleter) { + BukkitCompleter completer = (BukkitCompleter) field.get(command); + completer.addCompleter(label, m, obj); + } else { + System.out.println("Unable to register tab completer " + m.getName() + + ". A tab completer is already registered for that command!"); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + private void defaultCommand(CommandArgs args) { + args.getSender().sendMessage(args.getLabel() + " is not handled! Oh noes!"); + } + +} diff --git a/src/main/java/me/abhi/practice/command/Completer.java b/src/main/java/me/abhi/practice/command/Completer.java new file mode 100644 index 0000000..bba84ae --- /dev/null +++ b/src/main/java/me/abhi/practice/command/Completer.java @@ -0,0 +1,37 @@ +package me.abhi.practice.command; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Command Framework - Completer
+ * The completer annotation used to designate methods as command completers. All + * methods should have a single CommandArgs argument and return a String List + * object + * + * @author minnymin3 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Completer { + + /** + * The command that this completer completes. If it is a sub command then + * its values would be separated by periods. ie. a command that would be a + * subcommand of test would be 'test.subcommandname' + * + * @return + */ + String name(); + + /** + * A list of alternate names that the completer is executed under. See + * name() for details on how names work + * + * @return + */ + String[] aliases() default {}; + +} diff --git a/src/main/java/me/abhi/practice/command/impl/hybrid/EventCommand.java b/src/main/java/me/abhi/practice/command/impl/hybrid/EventCommand.java new file mode 100644 index 0000000..c9135f2 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/hybrid/EventCommand.java @@ -0,0 +1,305 @@ +package me.abhi.practice.command.impl.hybrid; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.hostedevent.EventState; +import me.abhi.practice.hostedevent.HostedEvent; +import me.abhi.practice.hostedevent.impl.SumoEvent; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.GameMode; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +@SuppressWarnings("Duplicates") +@AllArgsConstructor +public class EventCommand { + + private final PracticePlugin plugin; + + @Command(name = "event", inGameOnly = true) + public void event(CommandArgs args) { + args.getSender().sendMessage(Messages.EVENT_HELP.getMessage()); + return; + } + + @Command(name = "event.start", permission = "practice.event.start", inGameOnly = true) + public void eventStart(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + + Player player = args.getPlayer(); + if (System.currentTimeMillis() - this.plugin.getManagerHandler().getEventManager().getLastEvent() <= this.plugin.getManagerHandler().getSettingsManager().getEventDelay() && !player.hasPermission("practice.event.bypass")) { + args.getSender().sendMessage(Messages.EVENT_DELAY.getMessage()); + return; + } + String name = args.getArgs(0); + + if (this.plugin.getManagerHandler().getEventManager().getEvent(name) == null) { + args.getSender().sendMessage(Messages.EVENT_DOESNT_EXIST.getMessage()); + return; + } + if (this.plugin.getManagerHandler().getEventManager().getStartedEvent(name) != null) { + args.getSender().sendMessage(Messages.EVENT_ALREADY_STARTED.getMessage()); + return; + } + HostedEvent event = this.plugin.getManagerHandler().getEventManager().getEvent(name); + this.plugin.getManagerHandler().getEventManager().getCurrentEvents().add(event); + + event.setDown(System.currentTimeMillis()); + new BukkitRunnable() { + int i = 30; + + public void run() { + + if (!plugin.getManagerHandler().getEventManager().getCurrentEvents().contains(event)) { + this.cancel(); + return; + } + + if (i % 10 == 0 && i > 0) { + TextComponent clickable = new TextComponent(Messages.EVENT_STARTING.getMessage().replace("%player%", player.getName()).replace("%event%", event.getName())); + clickable.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/event join " + event.getName())); + clickable.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(Messages.EVENT_HOVER.getMessage().replace("%event%", event.getName())).create())); + + plugin.getServer().getOnlinePlayers().stream().forEach(p -> p.spigot().sendMessage(clickable)); + } + i -= 1; + if (i == 0) { + event.setStartTime(System.currentTimeMillis()); + event.startRound(); + + event.setEventState(EventState.STARTED); + this.cancel(); + } + } + }.runTaskTimer(this.plugin, 0L, 20L); + return; + } + + @Command(name = "event.stop", permission = "practice.command.event", inGameOnly = true) + public void eventStop(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + + Player player = args.getPlayer(); + if (System.currentTimeMillis() - this.plugin.getManagerHandler().getEventManager().getLastEvent() <= this.plugin.getManagerHandler().getSettingsManager().getEventDelay() && !player.hasPermission("practice.event.bypass")) { + args.getSender().sendMessage(Messages.EVENT_DELAY.getMessage()); + return; + } + String name = args.getArgs(0); + + if (this.plugin.getManagerHandler().getEventManager().getEvent(name) == null) { + args.getSender().sendMessage(Messages.EVENT_DOESNT_EXIST.getMessage()); + return; + } + if (this.plugin.getManagerHandler().getEventManager().getStartedEvent(name) == null) { + args.getSender().sendMessage(Messages.NO_EVENT_STARTED.getMessage()); + return; + } + HostedEvent hostedEvent = this.plugin.getManagerHandler().getEventManager().getStartedEvent(name); + hostedEvent.end(hostedEvent.getName(), null); + return; + } + + @Command(name = "event.join", inGameOnly = true) + public void eventJoin(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.LOBBY) { + args.getSender().sendMessage(Messages.MUST_BE_IN_LOBBY.getMessage()); + return; + } + String name = args.getArgs(0); + HostedEvent event = this.plugin.getManagerHandler().getEventManager().getEvent(name); + if (event == null) { + args.getSender().sendMessage(Messages.EVENT_DOESNT_EXIST.getMessage()); + return; + } + HostedEvent currentEvent = this.plugin.getManagerHandler().getEventManager().getStartedEvent(name); + if (currentEvent == null) { + args.getSender().sendMessage(Messages.NO_EVENT_STARTED.getMessage()); + return; + } + if (currentEvent.getEventState() != EventState.STARTING) { + args.getSender().sendMessage(Messages.EVENT_ALREADY_STARTED.getMessage()); + return; + } + if (event.getPlayers().size() >= this.plugin.getManagerHandler().getSettingsManager().getPlayersPerEvent() && !player.hasPermission("practice.event.bypass")) { + args.getSender().sendMessage(Messages.EVENT_FULL.getMessage()); + return; + } + currentEvent.getPlayers().add(player.getUniqueId()); + practiceProfile.setPlayerState(PlayerState.EVENT); + + currentEvent.broadcast(Messages.PLAYER_JOINED_EVENT.getMessage().replace("%player%", player.getName())); + + practiceProfile.setHostedEvent(currentEvent); + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + + this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, () -> { + currentEvent.getPlayers().forEach(u -> { + Player players = this.plugin.getServer().getPlayer(u); + + players.showPlayer(player); + player.showPlayer(players); + }); + }, 1L); + + player.teleport(event.getLobby()); + return; + } + + @Command(name = "event.spectate", aliases = {"event.spec", "event.sp"}, inGameOnly = true) + public void eventSpectate(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.LOBBY) { + args.getSender().sendMessage(Messages.MUST_BE_IN_LOBBY.getMessage()); + return; + } + String name = args.getArgs(0); + HostedEvent event = this.plugin.getManagerHandler().getEventManager().getEvent(name); + if (event == null) { + args.getSender().sendMessage(Messages.EVENT_DOESNT_EXIST.getMessage()); + return; + } + HostedEvent currentEvent = this.plugin.getManagerHandler().getEventManager().getStartedEvent(name); + if (currentEvent == null) { + args.getSender().sendMessage(Messages.NO_EVENT_STARTED.getMessage()); + return; + } + event.getSpectators().add(player.getUniqueId()); + practiceProfile.setHostedEvent(event); + practiceProfile.setPlayerState(PlayerState.SPECTATING_EVENT); + + player.teleport(event.getLobby()); + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + if (!practiceProfile.isSilentMode()) + event.broadcast(Messages.PLAYER_NOW_SPECTATING.getMessage().replace("%player%", player.getName())); + + player.setGameMode(GameMode.CREATIVE); + + event.getPlayers().forEach(u -> player.showPlayer(this.plugin.getServer().getPlayer(u))); + return; + + } + + @Command(name = "event.leave", inGameOnly = true) + public void eventLeave(CommandArgs args) { + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.EVENT && practiceProfile.getPlayerState() != PlayerState.SPECTATING_EVENT) { + args.getSender().sendMessage(Messages.NOT_IN_EVENT.getMessage()); + return; + } + HostedEvent hostedEvent = practiceProfile.getHostedEvent(); + + if (hostedEvent instanceof SumoEvent) { + SumoEvent sumoEvent = (SumoEvent) hostedEvent; + + if (sumoEvent.getP1() == player || sumoEvent.getP2() == player) { + sumoEvent.eliminatePlayer(player); + } + } + + practiceProfile.setPlayerState(PlayerState.LOBBY); + if (hostedEvent.getPlayers().contains(player.getUniqueId())) { + hostedEvent.getPlayers().remove(player.getUniqueId()); + + hostedEvent.broadcast(Messages.PLAYER_LEFT_EVENT.getMessage().replace("%player%", player.getName())); + args.getSender().sendMessage(Messages.LEFT_EVENT.getMessage()); + } + if (hostedEvent.getSpectators().contains(player.getUniqueId())) { + hostedEvent.getSpectators().remove(player.getUniqueId()); + + if (!practiceProfile.isSilentMode()) + hostedEvent.broadcast(Messages.PLAYER_NO_LONGER_SPECTATING.getMessage().replace("%player%", player.getName())); + args.getSender().sendMessage(Messages.NO_LONGER_SPECTATING.getMessage()); + } + + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + this.plugin.getManagerHandler().getPlayerManager().teleportSpawn(player); + return; + } + + @Command(name = "event.lobby", permission = "practice.command.event", inGameOnly = true) + public void eventLobby(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + HostedEvent event = this.plugin.getManagerHandler().getEventManager().getEvent(name); + if (event == null) { + args.getSender().sendMessage(Messages.EVENT_DOESNT_EXIST.getMessage()); + return; + } + Player player = args.getPlayer(); + event.setLobby(player.getLocation()); + + args.getSender().sendMessage(Messages.EVENT_LOBBY_SET.getMessage().replace("%event%", event.getName())); + return; + } + + @Command(name = "event.first", permission = "practice.command.event", inGameOnly = true) + public void eventFirst(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + HostedEvent event = this.plugin.getManagerHandler().getEventManager().getEvent(name); + if (event == null) { + args.getSender().sendMessage(Messages.EVENT_DOESNT_EXIST.getMessage()); + return; + } + Player player = args.getPlayer(); + event.setFirst(player.getLocation()); + + args.getSender().sendMessage(Messages.EVENT_FIRST_SET.getMessage().replace("%event%", event.getName())); + return; + } + + @Command(name = "event.second", permission = "practice.command.event", inGameOnly = true) + public void eventSecond(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + HostedEvent event = this.plugin.getManagerHandler().getEventManager().getEvent(name); + if (event == null) { + args.getSender().sendMessage(Messages.EVENT_DOESNT_EXIST.getMessage()); + return; + } + Player player = args.getPlayer(); + event.setSecond(player.getLocation()); + + args.getSender().sendMessage(Messages.EVENT_SECOND_SET.getMessage().replace("%event%", event.getName())); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/management/BuilderCommand.java b/src/main/java/me/abhi/practice/command/impl/management/BuilderCommand.java new file mode 100644 index 0000000..5511d03 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/management/BuilderCommand.java @@ -0,0 +1,25 @@ +package me.abhi.practice.command.impl.management; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +@AllArgsConstructor +public class BuilderCommand { + + private final PracticePlugin plugin; + + @Command(name = "builder", aliases = {"building", "buildmode"}, permission = "practice.command.builder", inGameOnly = true) + public void builder(CommandArgs args) { + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + practiceProfile.setBuildMode(!practiceProfile.isBuildMode()); + args.getSender().sendMessage(practiceProfile.isBuildMode() ? Messages.BUILDER_ENABLED.getMessage() : Messages.BUILDER_DISABLED.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/management/SetEditorCommand.java b/src/main/java/me/abhi/practice/command/impl/management/SetEditorCommand.java new file mode 100644 index 0000000..a62a6d8 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/management/SetEditorCommand.java @@ -0,0 +1,23 @@ +package me.abhi.practice.command.impl.management; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +@AllArgsConstructor +public class SetEditorCommand { + + private final PracticePlugin plugin; + + @Command(name = "seteditor", permission = "practice.command.seteditor", inGameOnly = true) + public void setEditor(CommandArgs args) { + Player player = args.getPlayer(); + + this.plugin.getManagerHandler().getSettingsManager().setEditor(player.getLocation()); + args.getSender().sendMessage(Messages.EDITOR_SET.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/management/SetSpawnCommand.java b/src/main/java/me/abhi/practice/command/impl/management/SetSpawnCommand.java new file mode 100644 index 0000000..c5ba338 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/management/SetSpawnCommand.java @@ -0,0 +1,23 @@ +package me.abhi.practice.command.impl.management; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +@AllArgsConstructor +public class SetSpawnCommand { + + private final PracticePlugin plugin; + + @Command(name = "setspawn", permission = "practice.command.setspawn", inGameOnly = true) + public void setSpawn(CommandArgs args) { + Player player = args.getPlayer(); + + this.plugin.getManagerHandler().getSettingsManager().setSpawn(player.getLocation()); + args.getSender().sendMessage(Messages.SPAWN_SET.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/management/arena/ArenaCommand.java b/src/main/java/me/abhi/practice/command/impl/management/arena/ArenaCommand.java new file mode 100644 index 0000000..b842b45 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/management/arena/ArenaCommand.java @@ -0,0 +1,152 @@ +package me.abhi.practice.command.impl.management.arena; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.arena.Arena; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.kit.KitType; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; +import org.bukkit.entity.Player; + +@SuppressWarnings("Duplicates") +@AllArgsConstructor +public class ArenaCommand { + + private final PracticePlugin plugin; + + @Command(name = "arena", permission = "practice.command.arena", inGameOnly = true) + public void arena(CommandArgs args) { + args.getSender().sendMessage(new String[]{ + CC.GRAY + "" + CC.STRIKE + "--------------------------------------------", + CC.GOLD + "" + CC.BOLD + "Arena Commands:", + CC.GRAY + " * " + CC.YELLOW + "/arena create - Create an arena", + CC.GRAY + " * " + CC.YELLOW + "/arena delete - Delete an arena", + CC.GRAY + " * " + CC.YELLOW + "/arena first - Set first spawn of an arena", + CC.GRAY + " * " + CC.YELLOW + "/arena second - Set second spawn of an arena", + CC.GRAY + " * " + CC.YELLOW + "/arena setType - Set type of an arena", + CC.GRAY + " * " + CC.YELLOW + "/arena tp - Teleport to an arena", + CC.GRAY + "" + CC.STRIKE + "--------------------------------------------" + }); + } + + @Command(name = "arena.create", permission = "practice.command.arena", inGameOnly = true) + public void arenaCreate(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Arena arena = this.plugin.getManagerHandler().getArenaManager().getArena(name); + + if (arena != null) { + args.getSender().sendMessage(Messages.ARENA_ALREADY_EXISTS.getMessage()); + return; + } + + this.plugin.getManagerHandler().getArenaManager().addArena(new Arena(name)); + args.getSender().sendMessage(Messages.ARENA_CREATED.getMessage().replace("%arena%", name)); + return; + } + + @Command(name = "arena.delete", permission = "practice.command.arena", inGameOnly = true) + public void arenaDelete(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Arena arena = this.plugin.getManagerHandler().getArenaManager().getArena(name); + + if (arena == null) { + args.getSender().sendMessage(Messages.ARENA_DOESNT_EXIST.getMessage()); + return; + } + + this.plugin.getManagerHandler().getArenaManager().removeArena(arena); + args.getSender().sendMessage(Messages.ARENA_DELETED.getMessage().replace("%arena%", name)); + return; + } + + @Command(name = "arena.first", permission = "practice.command.arena", inGameOnly = true) + public void arenaFirst(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Arena arena = this.plugin.getManagerHandler().getArenaManager().getArena(name); + + if (arena == null) { + args.getSender().sendMessage(Messages.ARENA_DOESNT_EXIST.getMessage()); + return; + } + Player player = args.getPlayer(); + + arena.setL1(player.getLocation()); + args.getSender().sendMessage(Messages.ARENA_FIRST_SET.getMessage().replace("%arena%", arena.getName())); + return; + } + + @Command(name = "arena.second", permission = "practice.command.arena", inGameOnly = true) + public void arenaSecond(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Arena arena = this.plugin.getManagerHandler().getArenaManager().getArena(name); + + if (arena == null) { + args.getSender().sendMessage(Messages.ARENA_DOESNT_EXIST.getMessage()); + return; + } + Player player = args.getPlayer(); + + arena.setL2(player.getLocation()); + args.getSender().sendMessage(Messages.ARENA_SECOND_SET.getMessage().replace("%arena%", arena.getName())); + return; + } + + @Command(name = "arena.settype", permission = "practice.command.arena", inGameOnly = true) + public void arenaSetType(CommandArgs args) { + if (args.length() != 2) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Arena arena = this.plugin.getManagerHandler().getArenaManager().getArena(name); + + if (arena == null) { + args.getSender().sendMessage(Messages.ARENA_DOESNT_EXIST.getMessage()); + return; + } + KitType kitType = KitType.getType(args.getArgs(1)); + if (kitType == null) { + args.getSender().sendMessage(Messages.KIT_TYPE_DOESNT_EXIST.getMessage()); + return; + } + arena.setKitType(kitType); + args.getSender().sendMessage(Messages.ARENA_TYPE_UPDATED.getMessage().replace("%arena%", arena.getName()).replace("%type%", kitType.toString())); + return; + } + + @Command(name = "arena.tp", permission = "practice.command.arena", inGameOnly = true) + public void arenaTp(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Arena arena = this.plugin.getManagerHandler().getArenaManager().getArena(name); + + if (arena == null) { + args.getSender().sendMessage(Messages.ARENA_DOESNT_EXIST.getMessage()); + return; + } + Player player = args.getPlayer(); + player.teleport(arena.getL1()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/management/arena/hcf/SetCapZoneCommand.java b/src/main/java/me/abhi/practice/command/impl/management/arena/hcf/SetCapZoneCommand.java new file mode 100644 index 0000000..3aa96ae --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/management/arena/hcf/SetCapZoneCommand.java @@ -0,0 +1,36 @@ +package me.abhi.practice.command.impl.management.arena.hcf; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.arena.Arena; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.kit.KitType; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; + +@SuppressWarnings("Duplicates") +@AllArgsConstructor +public class SetCapZoneCommand { + + private final PracticePlugin plugin; + + @Command(name = "setcapzone", permission = "practice.command.setcapzone", inGameOnly = true) + public void setCapZone(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Arena arena = this.plugin.getManagerHandler().getArenaManager().getArena(name); + if (arena == null) { + args.getSender().sendMessage(Messages.ARENA_DOESNT_EXIST.getMessage()); + return; + } + if (arena.getKitType() != KitType.HCF) { + args.getSender().sendMessage(Messages.NOT_HCF_ARENA.getMessage()); + return; + } + /* Will end up adding koths eventually */ + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/management/kit/KitCommand.java b/src/main/java/me/abhi/practice/command/impl/management/kit/KitCommand.java new file mode 100644 index 0000000..9c504d0 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/management/kit/KitCommand.java @@ -0,0 +1,332 @@ +package me.abhi.practice.command.impl.management.kit; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.kit.Kit; +import me.abhi.practice.kit.KitType; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.InventoryUtil; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; +import org.apache.commons.lang.math.NumberUtils; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +@SuppressWarnings("Duplicates") +@AllArgsConstructor +public class KitCommand { + + private final PracticePlugin plugin; + + @Command(name = "kit", permission = "practice.command.kit", inGameOnly = true) + public void kit(CommandArgs args) { + args.getSender().sendMessage(new String[]{ + CC.GRAY + "" + CC.STRIKE + "--------------------------------------------", + CC.GOLD + "" + CC.BOLD + "Kit Commands:", + CC.GRAY + " * " + CC.YELLOW + "/kit create - Create a kit", + CC.GRAY + " * " + CC.YELLOW + "/kit delete - Delete a kit", + CC.GRAY + " * " + CC.YELLOW + "/kit setDisplay - Set display icon of a kit", + CC.GRAY + " * " + CC.YELLOW + "/kit setKit - Set inventory of a kit", + CC.GRAY + " * " + CC.YELLOW + "/kit setEditChest - Set edit chest value of a kit", + CC.GRAY + " * " + CC.YELLOW + "/kit setEditInv - Set edit inventory a kit", + CC.GRAY + " * " + CC.YELLOW + "/kit setType - Set type of a kit", + CC.GRAY + " * " + CC.YELLOW + "/kit setDamageTicks - Set damage ticks of a kit", + CC.GRAY + " * " + CC.YELLOW + "/kit setRanked - Set ranked value of a kit", + CC.GRAY + " * " + CC.YELLOW + "/kit setUnranked - Set unranked value of a kit", + CC.GRAY + " * " + CC.YELLOW + "/kit setEditable - Set editable value of a kit", + CC.GRAY + " * " + CC.YELLOW + "/kit loadKit - Load the inventory of a kit", + CC.GRAY + "" + CC.STRIKE + "--------------------------------------------" + }); + } + + @Command(name = "kit.create", permission = "practice.command.kit", inGameOnly = true) + public void kitCreate(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(name); + + if (name.equalsIgnoreCase("hcf")) { + args.getSender().sendMessage(CC.RED + "This kit name is reserved."); + return; + } + + if (kit != null) { + args.getSender().sendMessage(Messages.KIT_ALREADY_EXISTS.getMessage()); + return; + } + this.plugin.getManagerHandler().getKitManager().addKit(new Kit(name)); + this.plugin.getManagerHandler().getMongoManager().getMongoDatabase().createCollection(name); + args.getSender().sendMessage(Messages.KIT_CREATED.getMessage().replace("%kit%", name)); + return; + } + + @Command(name = "kit.delete", permission = "practice.command.kit", inGameOnly = true) + public void kitDelete(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(name); + + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + this.plugin.getManagerHandler().getKitManager().removeKit(kit); + this.plugin.getManagerHandler().getMongoManager().getMongoDatabase().getCollection(kit.getName()).drop(); + args.getSender().sendMessage(Messages.KIT_DELETED.getMessage().replace("%kit%", kit.getName())); + return; + } + + @Command(name = "kit.setdisplay", permission = "practice.command.kit", inGameOnly = true) + public void kitSetDisplay(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(name); + + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + + Player player = args.getPlayer(); + if (player.getItemInHand().getType() == Material.AIR) { + args.getSender().sendMessage(Messages.HAND_CANT_BE_AIR.getMessage()); + return; + } + kit.setDisplay(player.getItemInHand()); + args.getSender().sendMessage(Messages.KIT_DISPLAY_SET.getMessage().replace("%kit%", kit.getName())); + return; + } + + @Command(name = "kit.setkit", permission = "practice.command.kit", inGameOnly = true) + public void kitSetKit(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(name); + + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + Player player = args.getPlayer(); + + kit.setInventory(InventoryUtil.cloneInventory(player.getInventory())); + kit.setArmor(InventoryUtil.cloneArmor(player.getInventory().getArmorContents())); + + args.getSender().sendMessage(Messages.KIT_INVENTORY_SET.getMessage().replace("%kit%", kit.getName())); + return; + } + + @Command(name = "kit.seteditchest", permission = "practice.command.kit", inGameOnly = true) + public void kitSetEditChest(CommandArgs args) { + if (args.length() != 2) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(name); + + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + try { + boolean value = Boolean.parseBoolean(args.getArgs(1)); + + kit.setEditChest(value); + args.getSender().sendMessage(Messages.KIT_EDITCHEST_UPDATED.getMessage().replace("%kit%", kit.getName()).replace("%value%", String.valueOf(value))); + } catch (Exception ex) { + args.getSender().sendMessage(CC.RED + "Invalid value."); + } + return; + } + + @Command(name = "kit.seteditinv", permission = "practice.command.kit", inGameOnly = true) + public void kitSetEditInv(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(name); + + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + practiceProfile.setEditInv(kit); + if (kit.getEditInventory() == null) + kit.setEditInventory(this.plugin.getServer().createInventory(null, 54, kit.getName())); + player.openInventory(kit.getEditInventory()); + return; + } + + @Command(name = "kit.settype", permission = "practice.command.kit", inGameOnly = true) + public void kitSetType(CommandArgs args) { + if (args.length() != 2) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(name); + + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + KitType kitType = KitType.getType(args.getArgs(1)); + if (kitType == null) { + args.getSender().sendMessage(Messages.KIT_TYPE_DOESNT_EXIST.getMessage()); + return; + } + if (kitType == KitType.HCF) { + args.getSender().sendMessage(CC.RED + "This type of kit is reserved."); + return; + } + kit.setKitType(kitType); + args.getSender().sendMessage(Messages.KIT_TYPE_UPDATED.getMessage().replace("%kit%", kit.getName()).replace("%type%", kitType.toString())); + return; + } + + @Command(name = "kit.setdamageticks", permission = "practice.command.kit", inGameOnly = true) + public void kitSetDamageTicks(CommandArgs args) { + if (args.length() != 2) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(name); + + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + if (!NumberUtils.isDigits(args.getArgs(1))) { + args.getSender().sendMessage(CC.RED + "Invalid amount."); + return; + } + int ticks = Integer.parseInt(args.getArgs(1)); + if (ticks < 0 || ticks > 20) { + args.getSender().sendMessage(CC.RED + "Please enter a valid amount between 0 and 20."); + return; + } + kit.setDamageTicks(ticks); + args.getSender().sendMessage(Messages.KIT_TICKS_UPDATED.getMessage().replace("%kit%", kit.getName()).replace("%ticks%", String.valueOf(ticks))); + return; + } + + @Command(name = "kit.setranked", permission = "practice.command.kit", inGameOnly = true) + public void kitSetRanked(CommandArgs args) { + if (args.length() != 2) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(name); + + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + try { + boolean value = Boolean.parseBoolean(args.getArgs(1)); + + kit.setRanked(value); + args.getSender().sendMessage(Messages.KIT_RANKED_UPDATED.getMessage().replace("%kit%", kit.getName()).replace("%value%", String.valueOf(value))); + } catch (Exception ex) { + args.getSender().sendMessage(CC.RED + "Invalid value."); + } + return; + } + + @Command(name = "kit.setunranked", permission = "practice.command.kit", inGameOnly = true) + public void kitSetUnranked(CommandArgs args) { + if (args.length() != 2) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(name); + + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + try { + boolean value = Boolean.parseBoolean(args.getArgs(1)); + + kit.setUnranked(value); + args.getSender().sendMessage(Messages.KIT_UNRANKED_UPDATED.getMessage().replace("%kit%", kit.getName()).replace("%value%", String.valueOf(value))); + } catch (Exception ex) { + args.getSender().sendMessage(CC.RED + "Invalid value."); + } + return; + } + + @Command(name = "kit.seteditable", permission = "practice.command.kit", inGameOnly = true) + public void kitSetEditable(CommandArgs args) { + if (args.length() != 2) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(name); + + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + try { + boolean value = Boolean.parseBoolean(args.getArgs(1)); + + kit.setEditable(value); + args.getSender().sendMessage(Messages.KIT_EDITABLE_UPDATED.getMessage().replace("%kit%", kit.getName()).replace("%value%", String.valueOf(value))); + } catch (Exception ex) { + args.getSender().sendMessage(CC.RED + "Invalid value."); + } + return; + } + + @Command(name = "kit.loadkit", permission = "practice.command.kit", inGameOnly = true) + public void kitLoadKit(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + String name = args.getArgs(0); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(name); + + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + if (kit.getInventory() == null || kit.getArmor() == null) { + args.getSender().sendMessage(Messages.KIT_NOT_SET.getMessage()); + return; + } + Player player = args.getPlayer(); + + player.getInventory().setContents(kit.getInventory().getContents()); + player.getInventory().setArmorContents(kit.getArmor()); + player.updateInventory(); + + args.getSender().sendMessage(Messages.LOADED_KIT.getMessage().replace("%kit%", kit.getName())); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/management/kit/hcf/SetArcherKitCommand.java b/src/main/java/me/abhi/practice/command/impl/management/kit/hcf/SetArcherKitCommand.java new file mode 100644 index 0000000..9a253a5 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/management/kit/hcf/SetArcherKitCommand.java @@ -0,0 +1,22 @@ +package me.abhi.practice.command.impl.management.kit.hcf; + +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.util.InventoryUtil; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +public class SetArcherKitCommand { + + @Command(name = "setarcherkit", permission = "practice.command.setarcherkit", inGameOnly = true) + public void setArcherKit(CommandArgs args) { + Player player = args.getPlayer(); + + HCFKit.ARCHER.setInventory(InventoryUtil.cloneInventory(player.getInventory())); + HCFKit.ARCHER.setArmor(InventoryUtil.cloneArmor(player.getInventory().getArmorContents())); + + args.getSender().sendMessage(Messages.ARCHER_KIT_SET.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/management/kit/hcf/SetBardKitCommand.java b/src/main/java/me/abhi/practice/command/impl/management/kit/hcf/SetBardKitCommand.java new file mode 100644 index 0000000..650c6ab --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/management/kit/hcf/SetBardKitCommand.java @@ -0,0 +1,22 @@ +package me.abhi.practice.command.impl.management.kit.hcf; + +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.util.InventoryUtil; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +public class SetBardKitCommand { + + @Command(name = "setbardkit", permission = "practice.command.setbardkit", inGameOnly = true) + public void setBardKit(CommandArgs args) { + Player player = args.getPlayer(); + + HCFKit.BARD.setInventory(InventoryUtil.cloneInventory(player.getInventory())); + HCFKit.BARD.setArmor(InventoryUtil.cloneArmor(player.getInventory().getArmorContents())); + + args.getSender().sendMessage(Messages.BARD_KIT_SET.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/management/kit/hcf/SetDiamondKitCommand.java b/src/main/java/me/abhi/practice/command/impl/management/kit/hcf/SetDiamondKitCommand.java new file mode 100644 index 0000000..4f5bbc1 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/management/kit/hcf/SetDiamondKitCommand.java @@ -0,0 +1,22 @@ +package me.abhi.practice.command.impl.management.kit.hcf; + +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.util.InventoryUtil; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +public class SetDiamondKitCommand { + + @Command(name = "setdiamondkit", permission = "practice.command.setdiamondkit", inGameOnly = true) + public void setDiamondKit(CommandArgs args) { + Player player = args.getPlayer(); + + HCFKit.DIAMOND.setInventory(InventoryUtil.cloneInventory(player.getInventory())); + HCFKit.DIAMOND.setArmor(InventoryUtil.cloneArmor(player.getInventory().getArmorContents())); + + args.getSender().sendMessage(Messages.DIAMOND_KIT_SET.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/management/kit/hcf/SetRogueKitCommand.java b/src/main/java/me/abhi/practice/command/impl/management/kit/hcf/SetRogueKitCommand.java new file mode 100644 index 0000000..903ed0a --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/management/kit/hcf/SetRogueKitCommand.java @@ -0,0 +1,22 @@ +package me.abhi.practice.command.impl.management.kit.hcf; + +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.util.InventoryUtil; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +public class SetRogueKitCommand { + + @Command(name = "setroguekit", permission = "practice.command.setroguekit", inGameOnly = true) + public void setRogueKit(CommandArgs args) { + Player player = args.getPlayer(); + + HCFKit.ROGUE.setInventory(InventoryUtil.cloneInventory(player.getInventory())); + HCFKit.ROGUE.setArmor(InventoryUtil.cloneArmor(player.getInventory().getArmorContents())); + + args.getSender().sendMessage(Messages.ROGUE_KIT_SET.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/player/AcceptCommand.java b/src/main/java/me/abhi/practice/command/impl/player/AcceptCommand.java new file mode 100644 index 0000000..0db205b --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/AcceptCommand.java @@ -0,0 +1,111 @@ +package me.abhi.practice.command.impl.player; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.match.Match; +import me.abhi.practice.match.MatchRequest; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyState; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.ListUtil; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; +import org.bukkit.entity.Player; + +@SuppressWarnings("Duplicates") +@AllArgsConstructor +public class AcceptCommand { + + private final PracticePlugin plugin; + + @Command(name = "accept", inGameOnly = true) + public void accept(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.LOBBY && practiceProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.MUST_BE_IN_LOBBY.getMessage()); + return; + } + Player target = this.plugin.getServer().getPlayer(args.getArgs(0)); + if (target == null) { + args.getSender().sendMessage(Messages.COULD_NOT_FIND_PLAYER.getMessage().replace("%player%", args.getArgs(0))); + return; + } + if (target == player) { + args.getSender().sendMessage(Messages.CANT_DUEL_YOURSELF.getMessage()); + return; + } + PracticeProfile targetProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(target); + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + Party party = practiceProfile.getParty(); + + if (party.getLeader() != player.getUniqueId()) { + args.getSender().sendMessage(Messages.MUST_BE_PARTY_LEADER.getMessage()); + return; + } + + if (party.getPartyState() != PartyState.LOBBY) { + args.getSender().sendMessage(Messages.MUST_BE_IN_LOBBY.getMessage()); + return; + } + + if (targetProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.PLAYER_NOT_IN_PARTY.getMessage().replace("%player%", target.getName())); + return; + } + + Party targetParty = targetProfile.getParty(); + if (targetParty.getPartyState() != PartyState.LOBBY) { + args.getSender().sendMessage(Messages.PARTY_NOT_IN_LOBBY.getMessage()); + return; + } + MatchRequest matchRequest = party.getMatchRequestList().stream().filter(m -> m.isParty() && targetParty.getMembers().contains(m.getRequester()) && System.currentTimeMillis() - m.getTimestamp() <= 60000).findFirst().orElse(null); + if (matchRequest == null) { + args.getSender().sendMessage(Messages.DUEL_REQUEST_NOT_FOUND.getMessage()); + return; + } + party.getMatchRequestList().remove(matchRequest); + + Match match = new Match(this.plugin, matchRequest.getKit(), party.getMembers(), targetParty.getMembers(), false, false); + match.start(); + + party.setMatch(match); + party.setPartyState(PartyState.MATCH); + + targetParty.setMatch(match); + targetParty.setPartyState(PartyState.MATCH); + return; + } + if (targetProfile.getPlayerState() != PlayerState.LOBBY) { + args.getSender().sendMessage(Messages.PLAYER_NOT_IN_LOBBY.getMessage().replace("%player%", target.getName())); + return; + } + MatchRequest matchRequest = practiceProfile.getMatchRequestList().stream().filter(m -> !m.isParty() && m.getRequester() == target.getUniqueId() && System.currentTimeMillis() - m.getTimestamp() <= 60000).findFirst().orElse(null); + if (matchRequest == null) { + args.getSender().sendMessage(Messages.DUEL_REQUEST_NOT_FOUND.getMessage()); + return; + } + practiceProfile.getMatchRequestList().remove(matchRequest); + + Match match = new Match(this.plugin, matchRequest.getKit(), ListUtil.newList(player.getUniqueId()), ListUtil.newList(target.getUniqueId()), false, false); + match.start(); + + practiceProfile.setMatch(match); + practiceProfile.setPlayerState(PlayerState.MATCH); + match.getKit().getUnrankedMatch().add(player.getUniqueId()); + + targetProfile.setMatch(match); + targetProfile.setPlayerState(PlayerState.MATCH); + match.getKit().getUnrankedMatch().add(target.getUniqueId()); + return; + } + +} diff --git a/src/main/java/me/abhi/practice/command/impl/player/DuelCommand.java b/src/main/java/me/abhi/practice/command/impl/player/DuelCommand.java new file mode 100644 index 0000000..58e2938 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/DuelCommand.java @@ -0,0 +1,103 @@ +package me.abhi.practice.command.impl.player; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.match.MatchRequest; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyState; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Menus; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; +import org.bukkit.entity.Player; + +@SuppressWarnings("Duplicates") +@AllArgsConstructor +public class DuelCommand { + + private final PracticePlugin plugin; + + @Command(name = "duel", aliases = {"1v1"}, inGameOnly = true) + public void duel(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + Player target = this.plugin.getServer().getPlayer(args.getArgs(0)); + if (target == null) { + args.getSender().sendMessage(Messages.COULD_NOT_FIND_PLAYER.getMessage().replace("%player%", args.getArgs(0))); + return; + } + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.LOBBY && practiceProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.MUST_BE_IN_LOBBY.getMessage()); + return; + } + + if (target == player) { + args.getSender().sendMessage(Messages.CANT_DUEL_YOURSELF.getMessage()); + return; + } + PracticeProfile targetProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(target); + + if (targetProfile.getPlayerState() != PlayerState.LOBBY && targetProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.PARTY_NOT_IN_LOBBY.getMessage()); + return; + } + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + Party party = practiceProfile.getParty(); + + if (party.getLeader() != player.getUniqueId()) { + args.getSender().sendMessage(Messages.MUST_BE_PARTY_LEADER.getMessage()); + return; + } + + if (targetProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.PLAYER_NOT_IN_PARTY.getMessage().replace("%player%", target.getName())); + return; + } + if (party.getMembers().contains(target.getUniqueId())) { + args.getSender().sendMessage(Messages.CANT_DUEL_YOURSELF.getMessage()); + return; + } + Party targetParty = targetProfile.getParty(); + if (targetParty.getPartyState() != PartyState.LOBBY) { + args.getSender().sendMessage(Messages.PLAYER_NOT_IN_LOBBY.getMessage().replace("%player%", target.getName())); + return; + } + MatchRequest matchRequest = targetParty.getMatchRequestList().stream().filter(m -> m.isParty() && party.getLeader() == m.getRequester() && System.currentTimeMillis() - m.getTimestamp() <= 60000).findFirst().orElse(null); + if (matchRequest != null) { + args.getSender().sendMessage(Messages.DUEL_REQUEST_EXISTS.getMessage()); + return; + } + party.setDueling(targetParty); + this.plugin.getManagerHandler().getPlayerManager().openPartyDuel(player); + return; + } + if (targetProfile.getPlayerState() == PlayerState.PARTY) { + args.getSender().sendMessage(Messages.MUST_CREATE_PARTY_TO_DUEL.getMessage().replace("%player%", target.getName())); + return; + } + if (targetProfile.getPlayerState() != PlayerState.LOBBY) { + args.getSender().sendMessage(Messages.PLAYER_NOT_IN_LOBBY.getMessage().replace("%player%", target.getName())); + return; + } + if (!targetProfile.isDuelRequests()) { + args.getSender().sendMessage(Messages.PLAYER_DISABLED_DUELS.getMessage().replace("%player%", player.getName())); + return; + } + MatchRequest matchRequest = targetProfile.getMatchRequestList().stream().filter(m -> !m.isParty() && player.getUniqueId() == m.getRequester() && System.currentTimeMillis() - m.getTimestamp() <= 60000).findFirst().orElse(null); + if (matchRequest != null) { + args.getSender().sendMessage(Messages.DUEL_REQUEST_EXISTS.getMessage()); + return; + } + practiceProfile.setDueling(target); + player.openInventory(Menus.DUEL.getInventory()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/player/InventoryCommand.java b/src/main/java/me/abhi/practice/command/impl/player/InventoryCommand.java new file mode 100644 index 0000000..22bc1be --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/InventoryCommand.java @@ -0,0 +1,38 @@ +package me.abhi.practice.command.impl.player; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; +import me.abhi.practice.util.misc.InventorySnapshot; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + +@AllArgsConstructor +public class InventoryCommand { + + private final PracticePlugin plugin; + + @Command(name = "inventory", aliases = {"inv"}, inGameOnly = true) + public void inventory(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + OfflinePlayer target = this.plugin.getServer().getOfflinePlayer(args.getArgs(0)); + + if (InventorySnapshot.getByUUID(target.getUniqueId()) == null) { + args.getSender().sendMessage(Messages.INVENTORY_NOT_FOUND.getMessage()); + return; + } + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + player.openInventory(InventorySnapshot.getByUUID(target.getUniqueId()).getInventory()); + practiceProfile.setViewingPlayerInv(true); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/player/LeaderboardsCommand.java b/src/main/java/me/abhi/practice/command/impl/player/LeaderboardsCommand.java new file mode 100644 index 0000000..c35ca2f --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/LeaderboardsCommand.java @@ -0,0 +1,97 @@ +package me.abhi.practice.command.impl.player; + +import com.mongodb.client.MongoCursor; +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.kit.Kit; +import me.abhi.practice.player.LeaderboardPlayer; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Menus; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; +import org.apache.commons.lang.math.NumberUtils; +import org.bson.Document; +import org.bukkit.entity.Player; + +import java.util.*; + +@SuppressWarnings("Duplicates") +@AllArgsConstructor +public class LeaderboardsCommand { + + private final PracticePlugin plugin; + + @Command(name = "leaderboards", aliases = {"lbs"}, inGameOnly = true) + public void leaderboards(CommandArgs args) { + if (this.plugin.getManagerHandler().getSettingsManager().isLeaderboardsGUI()) { + Player player = args.getPlayer(); + + player.openInventory(Menus.LEADERBOARDS.getInventory()); + return; + } + if (args.length() != 2) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(args.getArgs(0)); + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + if (!kit.isRanked()) { + args.getSender().sendMessage(Messages.KIT_ISNT_RANKED.getMessage()); + return; + } + if (!NumberUtils.isDigits(args.getArgs(1))) { + args.getSender().sendMessage(Messages.INVALID_PAGE_NUMBER.getMessage()); + return; + } + int page = Integer.parseInt(args.getArgs(1)); + + List leaderboardPlayers = new ArrayList<>(); + + this.plugin.getServer().getOnlinePlayers().forEach(p -> { + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(p); + + leaderboardPlayers.add(new LeaderboardPlayer(p.getName(), practiceProfile.getElo(kit))); + }); + + + MongoCursor practiceDocuments = this.plugin.getManagerHandler().getMongoManager().getMongoDatabase().getCollection(kit.getName()).find().iterator(); + + while (practiceDocuments.hasNext()) { + Document playerDocument = practiceDocuments.next(); + UUID uuid = UUID.fromString(playerDocument.getString("uuid")); + + if (this.plugin.getServer().getPlayer(uuid) == null) { + String username = playerDocument.getString("username"); + int elo = playerDocument.getInteger("elo"); + + leaderboardPlayers.add(new LeaderboardPlayer(username, elo)); + } + } + int start = (page * 10) - 10; + int end = (page * 10) - 1; + + if (leaderboardPlayers.size() < start) { + args.getSender().sendMessage(Messages.LEADERBOARDS_PAGE_DOESNT_EXIST.getMessage()); + return; + } + + leaderboardPlayers.sort(Comparator.comparing(LeaderboardPlayer::getElo)); + Collections.reverse(leaderboardPlayers); + + args.getSender().sendMessage(Messages.LEADERBOARDS_HEADER.getMessage().replace("%kit%", kit.getName()).replace("%page%", String.valueOf(page))); + for (int i = start; i <= end; i++) { + if (i < leaderboardPlayers.size()) { + LeaderboardPlayer leaderboardPlayer = leaderboardPlayers.get(i); + + args.getSender().sendMessage(Messages.LEADERBOARDS_PLAYER.getMessage().replace("%place%", String.valueOf(i + 1)).replace("%player%", leaderboardPlayer.getName()).replace("%elo%", String.valueOf(leaderboardPlayer.getElo()))); + } + } + return; + } + +} diff --git a/src/main/java/me/abhi/practice/command/impl/player/PartyCommand.java b/src/main/java/me/abhi/practice/command/impl/player/PartyCommand.java new file mode 100644 index 0000000..c4d1286 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/PartyCommand.java @@ -0,0 +1,349 @@ +package me.abhi.practice.command.impl.player; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.match.Match; +import me.abhi.practice.match.MatchDeathReason; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyInvite; +import me.abhi.practice.party.PartyState; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.craftbukkit.libs.joptsimple.internal.Strings; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +@SuppressWarnings("Duplicates") +@AllArgsConstructor +public class PartyCommand { + + private final PracticePlugin plugin; + + @Command(name = "party", aliases = {"p"}, inGameOnly = true) + public void party(CommandArgs args) { + args.getSender().sendMessage(Messages.PARTY_HELP.getMessage()); + return; + } + + @Command(name = "party.create", aliases = {"p.create"}, inGameOnly = true) + public void partyCreate(CommandArgs args) { + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.LOBBY) { + args.getSender().sendMessage(Messages.MUST_BE_IN_LOBBY.getMessage()); + return; + } + + Party party = new Party(); + party.setLeader(player.getUniqueId()); + party.getMembers().add(player.getUniqueId()); + + practiceProfile.setParty(party); + practiceProfile.setPlayerState(PlayerState.PARTY); + + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + args.getSender().sendMessage(Messages.CREATED_PARTY.getMessage()); + return; + } + + @Command(name = "party.invite", aliases = {"p.invite"}, inGameOnly = true) + public void partyInvite(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.NOT_IN_PARTY.getMessage()); + return; + } + Party party = practiceProfile.getParty(); + + if (party.getLeader() != player.getUniqueId()) { + args.getSender().sendMessage(Messages.MUST_BE_PARTY_LEADER.getMessage()); + return; + } + + if (party.getPartyState() != PartyState.LOBBY) { + args.getSender().sendMessage(Messages.MUST_BE_IN_LOBBY.getMessage()); + return; + } + + Player target = this.plugin.getServer().getPlayer(args.getArgs(0)); + if (target == null) { + args.getSender().sendMessage(Messages.COULD_NOT_FIND_PLAYER.getMessage().replace("%player%", args.getArgs(0))); + return; + } + + PracticeProfile targetProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(target); + + if (targetProfile.getPlayerState() != PlayerState.LOBBY) { + args.getSender().sendMessage(Messages.PLAYER_NOT_IN_LOBBY.getMessage().replace("%player%", target.getName())); + return; + } + PartyInvite partyInvite = targetProfile.getPartyInviteList().stream().filter(p -> p.getParty() == party && System.currentTimeMillis() - p.getTimestamp() <= 60000).findFirst().orElse(null); + + if (partyInvite != null) { + args.getSender().sendMessage(Messages.EXISTING_PARTY_INVITE.getMessage()); + return; + } + if (party.getMembers().size() >= this.plugin.getManagerHandler().getSettingsManager().getMaxPartyMembers()) { + args.getSender().sendMessage(Messages.PARTY_FULL.getMessage()); + return; + } + targetProfile.getPartyInviteList().add(new PartyInvite(party)); + + party.broadcast(Messages.PARTY_INVITE_SENT.getMessage().replace("%player%", target.getName())); + + TextComponent clickable = new TextComponent(Messages.PARTY_INVITE.getMessage().replace("%player%", player.getName()).replace("%amount%", String.valueOf(party.getMembers().size()))); + clickable.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(Messages.PARTY_INVITE_HOVER.getMessage().replace("%player%", player.getName())).create())); + clickable.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/party join " + player.getName())); + + target.spigot().sendMessage(clickable); + return; + } + + @Command(name = "party.join", aliases = {"p.join"}, inGameOnly = true) + public void partyJoin(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.LOBBY) { + args.getSender().sendMessage(Messages.MUST_BE_IN_LOBBY.getMessage()); + return; + } + + Player target = this.plugin.getServer().getPlayer(args.getArgs(0)); + if (target == null) { + args.getSender().sendMessage(Messages.COULD_NOT_FIND_PLAYER.getMessage().replace("%player%", args.getArgs(0))); + return; + } + PracticeProfile targetProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(target); + if (targetProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.PLAYER_NOT_IN_PARTY.getMessage().replace("%player%", target.getName())); + return; + } + Party party = targetProfile.getParty(); + if (party.getPartyState() != PartyState.LOBBY) { + args.getSender().sendMessage(Messages.PLAYERS_PARTY_NOT_IN_LOBBY.getMessage().replace("%player%", target.getName())); + return; + } + PartyInvite partyInvite = practiceProfile.getPartyInviteList().stream().filter(p -> p.getParty() == party && System.currentTimeMillis() - p.getTimestamp() <= 60000).findFirst().orElse(null); + if (partyInvite == null && !party.isOpen()) { + args.getSender().sendMessage(Messages.PARTY_INVITE_NOT_FOUND.getMessage()); + return; + } + if (party.getMembers().size() >= this.plugin.getManagerHandler().getSettingsManager().getMaxPartyMembers()) { + args.getSender().sendMessage(Messages.PARTY_FULL.getMessage()); + return; + } + practiceProfile.getPartyInviteList().remove(partyInvite); + practiceProfile.setParty(party); + party.getMembers().add(player.getUniqueId()); + practiceProfile.setPlayerState(PlayerState.PARTY); + + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + + party.broadcast(Messages.PLAYER_JOINED_PARTY.getMessage().replace("%player%", player.getName())); + return; + } + + @Command(name = "party.leave", aliases = {"p.leave"}, inGameOnly = true) + public void partyLeave(CommandArgs args) { + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.NOT_IN_PARTY.getMessage()); + return; + } + Party party = practiceProfile.getParty(); + if (party.getLeader() == player.getUniqueId()) { + args.getSender().sendMessage(Messages.LEADER_CANT_LEAVE.getMessage()); + return; + } + party.getMembers().remove(player.getUniqueId()); + if (party.getPartyState() == PartyState.MATCH) { + Match match = party.getMatch(); + + match.getExempt().add(player.getUniqueId()); + + this.plugin.getManagerHandler().getPlayerManager().teleportSpawn(player); + } + practiceProfile.setPlayerState(PlayerState.LOBBY); + practiceProfile.setParty(null); + practiceProfile.setHcfKit(HCFKit.DIAMOND); + + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + party.broadcast(Messages.PLAYER_LEFT_PARTY.getMessage().replace("%player%", player.getName())); + args.getSender().sendMessage(Messages.LEFT_PARTY.getMessage()); + return; + } + + @Command(name = "party.kick", aliases = {"p.kick"}, inGameOnly = true) + public void partyKick(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.NOT_IN_PARTY.getMessage()); + return; + } + Party party = practiceProfile.getParty(); + if (party.getLeader() != player.getUniqueId()) { + args.getSender().sendMessage(Messages.MUST_BE_PARTY_LEADER.getMessage()); + return; + } + Player target = this.plugin.getServer().getPlayer(args.getArgs(0)); + if (target == null) { + args.getSender().sendMessage(Messages.COULD_NOT_FIND_PLAYER.getMessage().replace("%player%", args.getArgs(0))); + return; + } + if (!party.getMembers().contains(target.getUniqueId())) { + args.getSender().sendMessage(Messages.PLAYER_NOT_IN_YOUR_PARTY.getMessage().replace("%player%", target.getName())); + return; + } + this.plugin.getServer().dispatchCommand(target, "party leave"); + return; + } + + @Command(name = "party.open", aliases = {"p.open"}, inGameOnly = true) + public void partyOpen(CommandArgs args) { + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.NOT_IN_PARTY.getMessage()); + return; + } + Party party = practiceProfile.getParty(); + if (party.getLeader() != player.getUniqueId()) { + args.getSender().sendMessage(Messages.MUST_BE_PARTY_LEADER.getMessage()); + return; + } + party.setOpen(!party.isOpen()); + party.broadcast(party.isOpen() ? Messages.PARTY_OPENED.getMessage() : Messages.PARTY_CLOSED.getMessage()); + return; + } + + @Command(name = "party.promote", aliases = {"p.promote"}, inGameOnly = true) + public void partyPromote(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.NOT_IN_PARTY.getMessage()); + return; + } + Party party = practiceProfile.getParty(); + if (party.getLeader() != player.getUniqueId()) { + args.getSender().sendMessage(Messages.MUST_BE_PARTY_LEADER.getMessage()); + return; + } + Player target = this.plugin.getServer().getPlayer(args.getArgs(0)); + if (target == null) { + args.getSender().sendMessage(Messages.COULD_NOT_FIND_PLAYER.getMessage().replace("%player%", args.getArgs(0))); + return; + } + if (!party.getMembers().contains(target.getUniqueId())) { + args.getSender().sendMessage(Messages.PLAYER_NOT_IN_YOUR_PARTY.getMessage().replace("%player%", target.getName())); + return; + } + if (party.getLeader() == target.getUniqueId()) { + args.getSender().sendMessage(Messages.CANT_PROMOTE_YOURSELF.getMessage()); + return; + } + party.setLeader(target.getUniqueId()); + if (party.getPartyState() == PartyState.LOBBY) { + + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + this.plugin.getManagerHandler().getPlayerManager().giveItems(target, true); + } + party.broadcast(Messages.PLAYER_PROMOTED.getMessage().replace("%player%", target.getName())); + return; + } + + @Command(name = "party.disband", aliases = {"p.disband"}, inGameOnly = true) + public void partyDisband(CommandArgs args) { + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.NOT_IN_PARTY.getMessage()); + return; + } + + Party party = practiceProfile.getParty(); + if (party.getLeader() != player.getUniqueId()) { + args.getSender().sendMessage(Messages.MUST_BE_PARTY_LEADER.getMessage()); + return; + } + + party.getMembers().stream().forEach(u -> { + Player member = this.plugin.getServer().getPlayer(u); + PracticeProfile memberProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(member); + + if (party.getPartyState() == PartyState.MATCH) { + Match match = party.getMatch(); + + match.addDeath(member, MatchDeathReason.LEFT, null); + + this.plugin.getManagerHandler().getPlayerManager().teleportSpawn(player); + } + + memberProfile.setPlayerState(PlayerState.LOBBY); + memberProfile.setParty(null); + memberProfile.setHcfKit(HCFKit.DIAMOND); + + this.plugin.getManagerHandler().getPlayerManager().giveItems(member, true); + member.sendMessage(Messages.PARTY_DISBANDED.getMessage()); + }); + party.setPartyState(PartyState.LOBBY); + party.setMatch(null); + party.getMembers().clear(); + return; + } + + @Command(name = "party.info", aliases = {"p.info"}, inGameOnly = true) + public void partyInfo(CommandArgs args) { + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.NOT_IN_PARTY.getMessage()); + return; + } + Party party = practiceProfile.getParty(); + Player leader = this.plugin.getServer().getPlayer(party.getLeader()); + List playerNames = new ArrayList<>(); + party.getMembers().stream().filter(u -> u != party.getLeader()).forEach(u -> playerNames.add(this.plugin.getServer().getPlayer(u).getName())); + args.getSender().sendMessage(Messages.PARTY_INFO.getMessage().replace("%leader%", leader.getName()).replace("%amount%", String.valueOf(party.getMembers().size() - 1)).replace("%members%", Strings.join(playerNames, ", ")).replace("%status%", party.isOpen() ? "Open" : "Closed")); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/player/SettingsCommand.java b/src/main/java/me/abhi/practice/command/impl/player/SettingsCommand.java new file mode 100644 index 0000000..8a467b3 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/SettingsCommand.java @@ -0,0 +1,25 @@ +package me.abhi.practice.command.impl.player; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.util.enums.Menus; +import org.bukkit.entity.Player; + +/** + * @author 7x6 + * @since 20/09/2019 + */ +@AllArgsConstructor +public class SettingsCommand { + + private final PracticePlugin plugin; + + @Command(name = "settings", inGameOnly = true) + public void settings(CommandArgs args) { + Player player = args.getPlayer(); + player.openInventory(Menus.SETTINGS.getInventory()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/player/SpawnCommand.java b/src/main/java/me/abhi/practice/command/impl/player/SpawnCommand.java new file mode 100644 index 0000000..a1bbdbc --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/SpawnCommand.java @@ -0,0 +1,42 @@ +package me.abhi.practice.command.impl.player; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyState; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +@AllArgsConstructor +public class SpawnCommand { + + private final PracticePlugin plugin; + + @Command(name = "spawn", inGameOnly = true) + public void spawn(CommandArgs args) { + Player player = args.getPlayer(); + + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.LOBBY && practiceProfile.getPlayerState() != PlayerState.QUEUE && practiceProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.INVALID_STATE.getMessage()); + return; + } + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + Party party = practiceProfile.getParty(); + + if (party.getPartyState() != PartyState.LOBBY && party.getPartyState() != PartyState.QUEUE) { + args.getSender().sendMessage(Messages.INVALID_STATE.getMessage()); + return; + } + } + + this.plugin.getManagerHandler().getPlayerManager().teleportSpawn(player); + args.getSender().sendMessage(Messages.TELEPORTING_TO_SPAWN.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/player/SpectateCommand.java b/src/main/java/me/abhi/practice/command/impl/player/SpectateCommand.java new file mode 100644 index 0000000..54c9e71 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/SpectateCommand.java @@ -0,0 +1,93 @@ +package me.abhi.practice.command.impl.player; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.match.Match; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyState; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; +import org.bukkit.GameMode; +import org.bukkit.entity.Player; + +@SuppressWarnings("Duplicates") +@AllArgsConstructor +public class SpectateCommand { + + private PracticePlugin plugin; + + @Command(name = "spectate", aliases = {"spec", "sp"}, inGameOnly = true) + public void spectate(CommandArgs args) { + if (args.length() != 1) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.LOBBY) { + args.getSender().sendMessage(Messages.MUST_BE_IN_LOBBY.getMessage()); + return; + } + + Player target = this.plugin.getServer().getPlayer(args.getArgs(0)); + if (target == null) { + args.getSender().sendMessage(Messages.COULD_NOT_FIND_PLAYER.getMessage().replace("%player%", args.getArgs(0))); + return; + } + + PracticeProfile targetProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(target); + if (targetProfile.getPlayerState() != PlayerState.MATCH && targetProfile.getPlayerState() != PlayerState.PARTY) { + args.getSender().sendMessage(Messages.PLAYER_NOT_IN_MATCH.getMessage().replace("%player%", target.getName())); + return; + } + if (targetProfile.getPlayerState() == PlayerState.PARTY) { + Party party = targetProfile.getParty(); + + if (party.getPartyState() != PartyState.MATCH) { + args.getSender().sendMessage(Messages.PLAYER_NOT_IN_MATCH.getMessage()); + return; + } + Match match = party.getMatch(); + practiceProfile.setPlayerState(PlayerState.SPECTATING); + practiceProfile.setSpectating(match); + match.getSpectators().add(player.getUniqueId()); + + player.teleport(target); + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + + match.getTeamOne().forEach(u -> player.showPlayer(this.plugin.getServer().getPlayer(u))); + match.getTeamTwo().forEach(u -> player.showPlayer(this.plugin.getServer().getPlayer(u))); + + if (!practiceProfile.isSilentMode()) + match.broadcast(Messages.PLAYER_NOW_SPECTATING.getMessage().replace("%player%", player.getName())); + + player.setGameMode(GameMode.CREATIVE); + return; + } + + Match match = targetProfile.getMatch(); + practiceProfile.setPlayerState(PlayerState.SPECTATING); + practiceProfile.setSpectating(match); + match.getSpectators().add(player.getUniqueId()); + + player.teleport(target); + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + this.plugin.getManagerHandler().getPlayerManager().hideAll(player); + + match.getTeamOne().forEach(u -> player.showPlayer(this.plugin.getServer().getPlayer(u))); + match.getTeamOne().forEach(u -> this.plugin.getServer().getPlayer(u).hidePlayer(player)); + match.getTeamTwo().forEach(u -> player.showPlayer(this.plugin.getServer().getPlayer(u))); + match.getTeamTwo().forEach(u -> this.plugin.getServer().getPlayer(u).hidePlayer(player)); + + if (!practiceProfile.isSilentMode()) + match.broadcast(Messages.PLAYER_NOW_SPECTATING.getMessage().replace("%player%", player.getName())); + + player.setGameMode(GameMode.CREATIVE); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/player/ToggleDuelRequestsCommand.java b/src/main/java/me/abhi/practice/command/impl/player/ToggleDuelRequestsCommand.java new file mode 100644 index 0000000..757d1c6 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/ToggleDuelRequestsCommand.java @@ -0,0 +1,25 @@ +package me.abhi.practice.command.impl.player; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +@AllArgsConstructor +public class ToggleDuelRequestsCommand { + + private final PracticePlugin plugin; + + @Command(name = "toggleduelrequests", aliases = {"tdr", "toggledr"}, inGameOnly = true) + public void toggleDuelRequests(CommandArgs args) { + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + practiceProfile.setDuelRequests(!practiceProfile.isDuelRequests()); + args.getSender().sendMessage(practiceProfile.isDuelRequests() ? Messages.DUEL_REQUEST_ENABLED.getMessage() : Messages.DUEL_REQUEST_DISABLED.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/player/ToggleScoreboardCommand.java b/src/main/java/me/abhi/practice/command/impl/player/ToggleScoreboardCommand.java new file mode 100644 index 0000000..41ca6a4 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/ToggleScoreboardCommand.java @@ -0,0 +1,26 @@ +package me.abhi.practice.command.impl.player; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +@AllArgsConstructor +public class ToggleScoreboardCommand { + + private final PracticePlugin plugin; + + @Command(name = "togglescoreboard", aliases = {"togglesidebar", "tsb", "togglesb"}, inGameOnly = true) + public void toggleScoreboard(CommandArgs args) { + Player player = args.getPlayer(); + + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + practiceProfile.setScoreboard(!practiceProfile.isScoreboard()); + + args.getSender().sendMessage(practiceProfile.isScoreboard() ? Messages.SCOREBOARD_ENABLED.getMessage() : Messages.SCOREBOARD_DISABLED.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/player/time/DayCommand.java b/src/main/java/me/abhi/practice/command/impl/player/time/DayCommand.java new file mode 100644 index 0000000..9da7ffe --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/time/DayCommand.java @@ -0,0 +1,18 @@ +package me.abhi.practice.command.impl.player.time; + +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +public class DayCommand { + + @Command(name = "day", inGameOnly = true) + public void day(CommandArgs args) { + Player player = args.getPlayer(); + + player.setPlayerTime(0L, false); + args.getSender().sendMessage(Messages.TIME_SET_DAY.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/player/time/NightCommand.java b/src/main/java/me/abhi/practice/command/impl/player/time/NightCommand.java new file mode 100644 index 0000000..cd4098f --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/time/NightCommand.java @@ -0,0 +1,18 @@ +package me.abhi.practice.command.impl.player.time; + +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +public class NightCommand { + + @Command(name = "night", inGameOnly = true) + public void night(CommandArgs args) { + Player player = args.getPlayer(); + + player.setPlayerTime(12000L, true); + args.getSender().sendMessage(Messages.TIME_SET_NIGHT.getMessage()); + return; + } +} \ No newline at end of file diff --git a/src/main/java/me/abhi/practice/command/impl/player/time/SunsetCommand.java b/src/main/java/me/abhi/practice/command/impl/player/time/SunsetCommand.java new file mode 100644 index 0000000..e52efa5 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/player/time/SunsetCommand.java @@ -0,0 +1,18 @@ +package me.abhi.practice.command.impl.player.time; + +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +public class SunsetCommand { + + @Command(name = "sunset", inGameOnly = true) + public void sunset(CommandArgs args) { + Player player = args.getPlayer(); + + player.setPlayerTime(6750L, false); + args.getSender().sendMessage(Messages.TIME_SET_SUNSET.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/staff/SetEloCommand.java b/src/main/java/me/abhi/practice/command/impl/staff/SetEloCommand.java new file mode 100644 index 0000000..0e5caa9 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/staff/SetEloCommand.java @@ -0,0 +1,75 @@ +package me.abhi.practice.command.impl.staff; + +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.Filters; +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.kit.Kit; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; +import org.apache.commons.lang.math.NumberUtils; +import org.bson.Document; +import org.bukkit.OfflinePlayer; + +import java.util.HashMap; +import java.util.Map; + +@AllArgsConstructor +public class SetEloCommand { + + private final PracticePlugin plugin; + + @Command(name = "setelo", permission = "practice.command.setelo") + public void setElo(CommandArgs args) { + if (args.length() != 3) { + args.getSender().sendMessage(CC.RED + "Usage: /" + args.getLabel() + " "); + return; + } + OfflinePlayer offlinePlayer = this.plugin.getServer().getOfflinePlayer(args.getArgs(0)); + if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore()) { + args.getSender().sendMessage(Messages.NEVER_PLAYED_BEFORE.getMessage().replace("%player%", args.getArgs(0))); + return; + } + String kitName = args.getArgs(1); + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(kitName); + if (kit == null) { + args.getSender().sendMessage(Messages.KIT_DOESNT_EXIST.getMessage()); + return; + } + if (!kit.isRanked()) { + args.getSender().sendMessage(Messages.KIT_ISNT_RANKED.getMessage()); + return; + } + if (!NumberUtils.isDigits(args.getArgs(2))) { + args.getSender().sendMessage(Messages.INVALID_AMOUNT.getMessage()); + return; + } + int newElo = Integer.parseInt(args.getArgs(2)); + if (newElo < this.plugin.getManagerHandler().getSettingsManager().getMinElo() || newElo > this.plugin.getManagerHandler().getSettingsManager().getMaxElo()) { + args.getSender().sendMessage(Messages.INVALID_ELO.getMessage()); + return; + } + if (offlinePlayer.isOnline()) { + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(offlinePlayer.getPlayer()); + practiceProfile.setElo(kit, newElo); + } else { + MongoCollection mongoCollection = this.plugin.getManagerHandler().getMongoManager().getMongoDatabase().getCollection(kit.getName()); + Map documentMap = new HashMap<>(); + + Document document = (Document) mongoCollection.find(Filters.eq("uuid", offlinePlayer.getUniqueId().toString())).first(); + + document.keySet().forEach(v -> documentMap.put(v, document.get(v))); + + documentMap.put("elo", newElo); + + if (document != null) mongoCollection.deleteOne(document); + + mongoCollection.insertOne(new Document(documentMap)); + } + args.getSender().sendMessage(Messages.SET_ELO.getMessage().replace("%player%", offlinePlayer.getName()).replace("%kit%", kit.getName()).replace("%elo%", String.valueOf(newElo))); + return; + } +} diff --git a/src/main/java/me/abhi/practice/command/impl/staff/SilentCommand.java b/src/main/java/me/abhi/practice/command/impl/staff/SilentCommand.java new file mode 100644 index 0000000..5140268 --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/staff/SilentCommand.java @@ -0,0 +1,26 @@ +package me.abhi.practice.command.impl.staff; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +@AllArgsConstructor +public class SilentCommand { + + private PracticePlugin plugin; + + @Command(name = "silent", aliases = {"silentmode"}, permission = "practice.command.silent", inGameOnly = true) + public void silent(CommandArgs args) { + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + practiceProfile.setSilentMode(!practiceProfile.isSilentMode()); + args.getSender().sendMessage(practiceProfile.isSilentMode() ? Messages.SILENT_ENABLED.getMessage() : Messages.SILENT_DISABLED.getMessage()); + return; + } + +} diff --git a/src/main/java/me/abhi/practice/command/impl/staff/TournamentCommand.java b/src/main/java/me/abhi/practice/command/impl/staff/TournamentCommand.java new file mode 100644 index 0000000..e540f3e --- /dev/null +++ b/src/main/java/me/abhi/practice/command/impl/staff/TournamentCommand.java @@ -0,0 +1,129 @@ +package me.abhi.practice.command.impl.staff; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.command.Command; +import me.abhi.practice.command.CommandArgs; +import me.abhi.practice.match.Match; +import me.abhi.practice.match.MatchDeathReason; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.tournament.Tournament; +import me.abhi.practice.tournament.TournamentState; +import me.abhi.practice.util.enums.Menus; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +@AllArgsConstructor +public class TournamentCommand { + + private final PracticePlugin plugin; + + @Command(name = "tournament", aliases = {"tourny"}, permission = "practice.command.tournament", inGameOnly = true) + public void tournament(CommandArgs args) { + args.getSender().sendMessage(Messages.TOURNAMENT_HELP.getMessage()); + return; + } + + @Command(name = "tournament.start", aliases = {"tourny.start"}, permission = "practice.command.tournament", inGameOnly = true) + public void tournamentStart(CommandArgs args) { + if (this.plugin.getManagerHandler().getTournamentManager().getTournament() != null) { + args.getSender().sendMessage(Messages.TOURNAMENT_ALREADY_STARTED.getMessage()); + return; + } + Player player = args.getPlayer(); + player.openInventory(Menus.TOURNAMENT.getInventory()); + return; + } + + @Command(name = "tournament.stop", aliases = {"tourny.stop"}, permission = "practice.command.tournament", inGameOnly = true) + public void tournamentStop(CommandArgs args) { + Tournament tournament = this.plugin.getManagerHandler().getTournamentManager().getTournament(); + if (tournament == null) { + args.getSender().sendMessage(Messages.NO_TOURNAMENT_STARTED.getMessage()); + return; + } + tournament.end(null); + return; + } + + @Command(name = "tournament.join", aliases = {"tourny.join"}, inGameOnly = true) + public void tournamentJoin(CommandArgs args) { + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.LOBBY) { + args.getSender().sendMessage(Messages.MUST_BE_IN_LOBBY.getMessage()); + return; + } + Tournament tournament = this.plugin.getManagerHandler().getTournamentManager().getTournament(); + if (tournament == null) { + args.getSender().sendMessage(Messages.NO_TOURNAMENT_STARTED.getMessage()); + return; + } + if (tournament.getTournamentState() != TournamentState.STARTING) { + args.getSender().sendMessage(Messages.TOURNAMENT_ALREADY_STARTED.getMessage()); + return; + } + if (tournament.getParticipants().size() >= this.plugin.getManagerHandler().getSettingsManager().getPlayersPerTournament() && !player.hasPermission("practice.tournament.bypass")) { + args.getSender().sendMessage(Messages.TOURNAMENT_FULL.getMessage()); + return; + } + practiceProfile.setTournament(tournament); + practiceProfile.setPlayerState(PlayerState.TOURNAMENT); + tournament.getParticipants().add(player.getUniqueId()); + + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + + tournament.broadcast(Messages.PLAYER_JOINED_TOURNAMENT.getMessage().replace("%player%", player.getName()).replace("%players%", String.valueOf(tournament.getParticipants().size())).replace("%max%", String.valueOf(this.plugin.getManagerHandler().getSettingsManager().getPlayersPerTournament()))); + return; + } + + @Command(name = "tournament.status", aliases = {"tourny.status"}, inGameOnly = true) + public void tournamentStatus(CommandArgs args) { + Tournament tournament = this.plugin.getManagerHandler().getTournamentManager().getTournament(); + if (tournament == null) { + args.getSender().sendMessage(Messages.NO_TOURNAMENT_STARTED.getMessage()); + return; + } + if (tournament.getTournamentState() != TournamentState.STARTED || tournament.getMatchList().size() == 0) { + args.getSender().sendMessage(Messages.TOURNAMENT_NO_FIGHTS.getMessage()); + return; + } + args.getSender().sendMessage(Messages.TOURNAMENT_STATUS_HEADER.getMessage()); + tournament.getMatchList().forEach(m -> args.getSender().sendMessage(Messages.TOURNAMENT_STATUS_MATCH.getMessage().replace("%player1%", m.getT1l().getName()).replace("%player2%", m.getT2l().getName()))); + args.getSender().sendMessage(Messages.TOURNAMENT_STATUS_FOOTER.getMessage()); + } + + @Command(name = "tournament.leave", aliases = {"tourny.leave"}, inGameOnly = true) + public void tournamentLeave(CommandArgs args) { + Player player = args.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.TOURNAMENT && practiceProfile.getPlayerState() != PlayerState.MATCH) { + args.getSender().sendMessage(Messages.NOT_IN_TOURNAMENT.getMessage()); + return; + } + if (practiceProfile.getPlayerState() == PlayerState.MATCH) { + Match match = practiceProfile.getMatch(); + + if (!match.isTournament()) { + args.getSender().sendMessage(Messages.NOT_IN_TOURNAMENT.getMessage()); + return; + } + match.addDeath(player, MatchDeathReason.LEFT, null); + return; + } + Tournament tournament = this.plugin.getManagerHandler().getTournamentManager().getTournament(); + tournament.getParticipants().remove(player.getUniqueId()); + tournament.broadcast(Messages.PLAYER_LEFT_TOURNAMENT.getMessage().replace("%player%", player.getName()).replace("%players%", String.valueOf(tournament.getParticipants().size())).replace("%max%", String.valueOf(this.plugin.getManagerHandler().getSettingsManager().getPlayersPerTournament()))); + + practiceProfile.setPlayerState(PlayerState.LOBBY); + practiceProfile.setTournament(null); + + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + + args.getSender().sendMessage(Messages.LEFT_TOURNAMENT.getMessage()); + return; + } +} diff --git a/src/main/java/me/abhi/practice/event/BaseEvent.java b/src/main/java/me/abhi/practice/event/BaseEvent.java new file mode 100644 index 0000000..f7eff38 --- /dev/null +++ b/src/main/java/me/abhi/practice/event/BaseEvent.java @@ -0,0 +1,22 @@ +package me.abhi.practice.event; + +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +@Getter +public class BaseEvent extends Event { + + @Getter + private static HandlerList handlerList = new HandlerList(); + + @Override + public HandlerList getHandlers() { + return handlerList; + } + + public void call() { + Bukkit.getPluginManager().callEvent(this); + } +} diff --git a/src/main/java/me/abhi/practice/event/PlayerEvent.java b/src/main/java/me/abhi/practice/event/PlayerEvent.java new file mode 100644 index 0000000..9621bd5 --- /dev/null +++ b/src/main/java/me/abhi/practice/event/PlayerEvent.java @@ -0,0 +1,12 @@ +package me.abhi.practice.event; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.entity.Player; + +@Getter +@AllArgsConstructor +public class PlayerEvent extends BaseEvent { + + private Player player; +} diff --git a/src/main/java/me/abhi/practice/event/impl/BardHoldItemEvent.java b/src/main/java/me/abhi/practice/event/impl/BardHoldItemEvent.java new file mode 100644 index 0000000..f17a573 --- /dev/null +++ b/src/main/java/me/abhi/practice/event/impl/BardHoldItemEvent.java @@ -0,0 +1,17 @@ +package me.abhi.practice.event.impl; + +import lombok.Getter; +import me.abhi.practice.event.PlayerEvent; +import me.abhi.practice.kit.hcf.data.bard.BardItem; +import org.bukkit.entity.Player; + +@Getter +public class BardHoldItemEvent extends PlayerEvent { + + private BardItem bardItem; + + public BardHoldItemEvent(Player player, BardItem bardItem) { + super(player); + this.bardItem = bardItem; + } +} diff --git a/src/main/java/me/abhi/practice/event/impl/BardTaskUpdateEvent.java b/src/main/java/me/abhi/practice/event/impl/BardTaskUpdateEvent.java new file mode 100644 index 0000000..12425d2 --- /dev/null +++ b/src/main/java/me/abhi/practice/event/impl/BardTaskUpdateEvent.java @@ -0,0 +1,11 @@ +package me.abhi.practice.event.impl; + +import me.abhi.practice.event.PlayerEvent; +import org.bukkit.entity.Player; + +public class BardTaskUpdateEvent extends PlayerEvent { + + public BardTaskUpdateEvent(Player player) { + super(player); + } +} diff --git a/src/main/java/me/abhi/practice/hostedevent/EventState.java b/src/main/java/me/abhi/practice/hostedevent/EventState.java new file mode 100644 index 0000000..d3363af --- /dev/null +++ b/src/main/java/me/abhi/practice/hostedevent/EventState.java @@ -0,0 +1,6 @@ +package me.abhi.practice.hostedevent; + +public enum EventState { + + STARTING, STARTED +} diff --git a/src/main/java/me/abhi/practice/hostedevent/HostedEvent.java b/src/main/java/me/abhi/practice/hostedevent/HostedEvent.java new file mode 100644 index 0000000..50c49a8 --- /dev/null +++ b/src/main/java/me/abhi/practice/hostedevent/HostedEvent.java @@ -0,0 +1,56 @@ +package me.abhi.practice.hostedevent; + +import lombok.Getter; +import lombok.Setter; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Setter +@Getter +public class HostedEvent { + + private String name; + private Location lobby; + private Location first; + private Location second; + private EventState eventState = EventState.STARTING; + private List players = new ArrayList<>(); + private List spectators = new ArrayList<>(); + private long startTime; + private long down; + + public void startRound() { + } + + public void eliminatePlayer(Player player) { + if (!getPlayers().contains(player.getUniqueId())) return; + + getPlayers().remove(player.getUniqueId()); + getSpectators().add(player.getUniqueId()); + + broadcast(Messages.EVENT_PLAYER_ELIMINATED.getMessage().replace("%player%", player.getName())); + + } + + public void end(String name, String winner) { + PracticePlugin.getInstance().getServer().broadcastMessage(winner != null ? Messages.EVENT_WINNER.getMessage().replace("%event%", name).replace("%player%", winner) : Messages.EVENT_CANCELLED.getMessage().replace("%event%", name)); + } + + public void broadcast(String message) { + getPlayers().forEach(u -> PracticePlugin.getInstance().getServer().getPlayer(u).sendMessage(message)); + getSpectators().forEach(u -> PracticePlugin.getInstance().getServer().getPlayer(u).sendMessage(message)); + } + + public void playSound(Sound sound) { + getPlayers().forEach(u -> PracticePlugin.getInstance().getServer().getPlayer(u).playSound(PracticePlugin.getInstance().getServer().getPlayer(u).getLocation(), sound, 20f, 20f)); + getSpectators().forEach(u -> PracticePlugin.getInstance().getServer().getPlayer(u).playSound(PracticePlugin.getInstance().getServer().getPlayer(u).getLocation(), sound, 20f, 20f)); + } + +} diff --git a/src/main/java/me/abhi/practice/hostedevent/impl/SumoEvent.java b/src/main/java/me/abhi/practice/hostedevent/impl/SumoEvent.java new file mode 100644 index 0000000..cc20436 --- /dev/null +++ b/src/main/java/me/abhi/practice/hostedevent/impl/SumoEvent.java @@ -0,0 +1,172 @@ +package me.abhi.practice.hostedevent.impl; + +import lombok.Getter; +import lombok.Setter; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.hostedevent.EventState; +import me.abhi.practice.hostedevent.HostedEvent; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.GameMode; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +@Getter +public class SumoEvent extends HostedEvent { + + private Player p1; + private Player p2; + + @Setter + private SumoState sumoState = SumoState.STARTING; + + @Override + public String getName() { + return "Sumo"; + } + + @Override + public void startRound() { + if (!check()) { + + sumoState = SumoState.STARTING; + + Collections.shuffle(getPlayers()); + p1 = PracticePlugin.getInstance().getServer().getPlayer(getPlayers().get(0)); + p2 = PracticePlugin.getInstance().getServer().getPlayer(getPlayers().get(1)); + + broadcast(Messages.SUMO_EVENT_MATCHUP.getMessage().replace("%player1%", p1.getName()).replace("%player2%", p2.getName())); + + p1.teleport(getFirst()); + p2.teleport(getSecond()); + + p1.getInventory().clear(); + p1.updateInventory(); + + p2.getInventory().clear(); + p2.updateInventory(); + + new BukkitRunnable() { + int i = 5; + + public void run() { + if (sumoState != SumoState.STARTING) { + this.cancel(); + return; + } + if (i > 0) { + broadcast(Messages.SUMO_EVENT_MATCH_STARTING.getMessage().replace("%time%", String.valueOf(i))); + playSound(Sound.NOTE_STICKS); + i -= 1; + } else { + sumoState = SumoState.STARTED; + broadcast(Messages.SUMO_EVENT_MATCH_STARTED.getMessage()); + playSound(Sound.NOTE_PLING); + this.cancel(); + } + } + }.runTaskTimer(PracticePlugin.getInstance(), 20L, 20L); + } + } + + @Override + public void eliminatePlayer(Player player) { + super.eliminatePlayer(player); + + p1.teleport(getLobby()); + p2.teleport(getLobby()); + + PracticeProfile practiceProfile = PracticePlugin.getInstance().getManagerHandler().getProfileManager().getProfile(player); + + getSpectators().add(player.getUniqueId()); + practiceProfile.setPlayerState(PlayerState.SPECTATING_EVENT); + player.setGameMode(GameMode.CREATIVE); + + PracticePlugin.getInstance().getManagerHandler().getPlayerManager().giveItems(p1, false); + PracticePlugin.getInstance().getManagerHandler().getPlayerManager().giveItems(p2, false); + + PracticePlugin.getInstance().getServer().getScheduler().scheduleSyncDelayedTask(PracticePlugin.getInstance(), () -> { + getPlayers().forEach(u -> { + Player players = PracticePlugin.getInstance().getServer().getPlayer(u); + + players.hidePlayer(player); + }); + }, 1L); + p1 = p2 = null; + + if (!check()) { + new BukkitRunnable() { + int i = 5; + + public void run() { + + if (i > 0) { + broadcast(Messages.SUMO_ROUND_STARTING.getMessage().replace("%time%", String.valueOf(i))); + playSound(Sound.NOTE_STICKS); + i -= 1; + } else { + startRound(); + playSound(Sound.NOTE_PLING); + this.cancel(); + } + } + }.runTaskTimer(PracticePlugin.getInstance(), 20L, 20L); + } + } + + @Override + public void end(String name, String winner) { + super.end(name, winner); + + List allPlayers = new ArrayList<>(); + getPlayers().forEach(allPlayers::add); + getSpectators().forEach(allPlayers::add); + + allPlayers.forEach(u -> { + Player player = PracticePlugin.getInstance().getServer().getPlayer(u); + + PracticeProfile practiceProfile = PracticePlugin.getInstance().getManagerHandler().getProfileManager().getProfile(player); + practiceProfile.setPlayerState(PlayerState.LOBBY); + practiceProfile.setHostedEvent(null); + + PracticePlugin.getInstance().getManagerHandler().getPlayerManager().giveItems(player, true); + PracticePlugin.getInstance().getManagerHandler().getPlayerManager().teleportSpawn(player); + }); + + getPlayers().clear(); + getSpectators().clear(); + + setDown(0); + setStartTime(0); + + sumoState = SumoState.STARTING; + setEventState(EventState.STARTING); + PracticePlugin.getInstance().getManagerHandler().getEventManager().getCurrentEvents().remove(this); + + p1 = p2 = null; + } + + private boolean check() { + if (getPlayers().size() == 0) { + end(getName(), null); + return true; + } else if (getPlayers().size() == 1) { + end(getName(), PracticePlugin.getInstance().getServer().getPlayer(getPlayers().get(0)).getName()); + return true; + } + return false; + } + + public enum SumoState { + + STARTING, STARTED + } + +} diff --git a/src/main/java/me/abhi/practice/kit/CustomKit.java b/src/main/java/me/abhi/practice/kit/CustomKit.java new file mode 100644 index 0000000..cf2c537 --- /dev/null +++ b/src/main/java/me/abhi/practice/kit/CustomKit.java @@ -0,0 +1,19 @@ +package me.abhi.practice.kit; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +@Getter +@AllArgsConstructor +public class CustomKit { + + private Inventory inventory; + private ItemStack[] armor; + private int number; + + @Setter + private String name; +} diff --git a/src/main/java/me/abhi/practice/kit/Kit.java b/src/main/java/me/abhi/practice/kit/Kit.java new file mode 100644 index 0000000..5b125eb --- /dev/null +++ b/src/main/java/me/abhi/practice/kit/Kit.java @@ -0,0 +1,35 @@ +package me.abhi.practice.kit; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import org.bukkit.Material; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +@RequiredArgsConstructor +public class Kit { + + private final String name; + private ItemStack display = new ItemStack(Material.IRON_SWORD); + private Inventory inventory; + private ItemStack[] armor; + private boolean editChest; + private Inventory editInventory; + private KitType kitType = KitType.NORMAL; + private int damageTicks = 19; + private boolean ranked; + private boolean unranked; + private boolean editable; + + private List unrankedQueue = new ArrayList<>(); + private List unrankedMatch = new ArrayList<>(); + private List rankedQueue = new ArrayList<>(); + private List rankedMatch = new ArrayList<>(); +} diff --git a/src/main/java/me/abhi/practice/kit/KitType.java b/src/main/java/me/abhi/practice/kit/KitType.java new file mode 100644 index 0000000..12d3c67 --- /dev/null +++ b/src/main/java/me/abhi/practice/kit/KitType.java @@ -0,0 +1,12 @@ +package me.abhi.practice.kit; + +import java.util.Arrays; + +public enum KitType { + + NORMAL, SUMO, HCF; + + public static KitType getType(String name) { + return Arrays.stream(values()).filter(t -> t.toString().equalsIgnoreCase(name)).findFirst().orElse(null); + } +} diff --git a/src/main/java/me/abhi/practice/kit/hcf/HCFKit.java b/src/main/java/me/abhi/practice/kit/hcf/HCFKit.java new file mode 100644 index 0000000..fc62967 --- /dev/null +++ b/src/main/java/me/abhi/practice/kit/hcf/HCFKit.java @@ -0,0 +1,25 @@ +package me.abhi.practice.kit.hcf; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +@Getter +@AllArgsConstructor +public enum HCFKit { + + DIAMOND("Diamond", null, null), + BARD("Bard", null, null), + ARCHER("Archer", null, null), + ROGUE("Rogue", null, null); + + private String name; + + @Setter + private Inventory inventory; + + @Setter + private ItemStack[] armor; +} diff --git a/src/main/java/me/abhi/practice/kit/hcf/data/archer/ArcherData.java b/src/main/java/me/abhi/practice/kit/hcf/data/archer/ArcherData.java new file mode 100644 index 0000000..818a2dd --- /dev/null +++ b/src/main/java/me/abhi/practice/kit/hcf/data/archer/ArcherData.java @@ -0,0 +1,22 @@ +package me.abhi.practice.kit.hcf.data.archer; + +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public class ArcherData { + + private List archerItemList; + + public ArcherData() { + archerItemList = new ArrayList<>(); + + archerItemList.add(new ArcherItem("Speed IV", Material.SUGAR, new PotionEffect(PotionEffectType.SPEED, 200, 3))); + archerItemList.add(new ArcherItem("Jumpboost V", Material.FEATHER, new PotionEffect(PotionEffectType.JUMP, 200, 4))); + } +} diff --git a/src/main/java/me/abhi/practice/kit/hcf/data/archer/ArcherItem.java b/src/main/java/me/abhi/practice/kit/hcf/data/archer/ArcherItem.java new file mode 100644 index 0000000..d9cc983 --- /dev/null +++ b/src/main/java/me/abhi/practice/kit/hcf/data/archer/ArcherItem.java @@ -0,0 +1,16 @@ +package me.abhi.practice.kit.hcf.data.archer; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.potion.PotionEffect; + +@Getter +@AllArgsConstructor +public class ArcherItem { + + private String name; + private Material material; + private PotionEffect activated; + +} \ No newline at end of file diff --git a/src/main/java/me/abhi/practice/kit/hcf/data/bard/BardData.java b/src/main/java/me/abhi/practice/kit/hcf/data/bard/BardData.java new file mode 100644 index 0000000..a9d0a11 --- /dev/null +++ b/src/main/java/me/abhi/practice/kit/hcf/data/bard/BardData.java @@ -0,0 +1,33 @@ +package me.abhi.practice.kit.hcf.data.bard; + +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public class BardData { + + private List bardItemList; + private List blockedList; + + public BardData() { + bardItemList = new ArrayList<>(); + + bardItemList.add(new BardItem("Speed III", Material.SUGAR, 35, new PotionEffect(PotionEffectType.SPEED, 120, 1), new PotionEffect(PotionEffectType.SPEED, 120, 2), true)); + bardItemList.add(new BardItem("Resistance III", Material.IRON_INGOT, 50, new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 120, 0), new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 120, 2), true)); + bardItemList.add(new BardItem("Jumpboost VII", Material.FEATHER, 40, new PotionEffect(PotionEffectType.JUMP, 120, 1), new PotionEffect(PotionEffectType.JUMP, 120, 6), true)); + bardItemList.add(new BardItem("Strength II", Material.BLAZE_POWDER, 50, new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 120, 0), new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 120, 1), false)); + bardItemList.add(new BardItem("Regen IV", Material.GHAST_TEAR, 50, new PotionEffect(PotionEffectType.REGENERATION, 120, 0), new PotionEffect(PotionEffectType.REGENERATION, 100, 3), true)); + bardItemList.add(new BardItem("Fire Resistance", Material.MAGMA_CREAM, 40, new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 120, 0), new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 400, 0), true)); + + blockedList = new ArrayList<>(); + blockedList.add(PotionEffectType.FIRE_RESISTANCE); + blockedList.add(PotionEffectType.INCREASE_DAMAGE); + blockedList.add(PotionEffectType.JUMP); + } + +} diff --git a/src/main/java/me/abhi/practice/kit/hcf/data/bard/BardItem.java b/src/main/java/me/abhi/practice/kit/hcf/data/bard/BardItem.java new file mode 100644 index 0000000..e7d60d6 --- /dev/null +++ b/src/main/java/me/abhi/practice/kit/hcf/data/bard/BardItem.java @@ -0,0 +1,19 @@ +package me.abhi.practice.kit.hcf.data.bard; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.potion.PotionEffect; + +@Getter +@AllArgsConstructor +public class BardItem { + + private String name; + private Material material; + private double energy; + private PotionEffect held; + private PotionEffect activated; + private boolean bard; + +} diff --git a/src/main/java/me/abhi/practice/kit/hcf/data/rogue/RogueData.java b/src/main/java/me/abhi/practice/kit/hcf/data/rogue/RogueData.java new file mode 100644 index 0000000..83fe100 --- /dev/null +++ b/src/main/java/me/abhi/practice/kit/hcf/data/rogue/RogueData.java @@ -0,0 +1,23 @@ +package me.abhi.practice.kit.hcf.data.rogue; + +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public class RogueData { + + private List rogueItemList; + + public RogueData() { + rogueItemList = new ArrayList<>(); + + rogueItemList.add(new RogueItem("Speed IV", Material.SUGAR, new PotionEffect(PotionEffectType.SPEED, 200, 3))); + rogueItemList.add(new RogueItem("Jumpboost V", Material.FEATHER, new PotionEffect(PotionEffectType.JUMP, 200, 4))); + } + +} diff --git a/src/main/java/me/abhi/practice/kit/hcf/data/rogue/RogueItem.java b/src/main/java/me/abhi/practice/kit/hcf/data/rogue/RogueItem.java new file mode 100644 index 0000000..126c81e --- /dev/null +++ b/src/main/java/me/abhi/practice/kit/hcf/data/rogue/RogueItem.java @@ -0,0 +1,16 @@ +package me.abhi.practice.kit.hcf.data.rogue; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.potion.PotionEffect; + +@Getter +@AllArgsConstructor +public class RogueItem { + + private String name; + private Material material; + private PotionEffect activated; + +} \ No newline at end of file diff --git a/src/main/java/me/abhi/practice/listener/PacketListener.java b/src/main/java/me/abhi/practice/listener/PacketListener.java new file mode 100644 index 0000000..7ab635f --- /dev/null +++ b/src/main/java/me/abhi/practice/listener/PacketListener.java @@ -0,0 +1,107 @@ +package me.abhi.practice.listener; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.player.PracticeProfile; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PotionSplashEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; + +@SuppressWarnings("Duplicates") +public class PacketListener implements Listener { + + private final PracticePlugin instance; + + public PacketListener(PracticePlugin instance) { + this.instance = instance; + + ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(instance, PacketType.Play.Client.CLIENT_COMMAND) { + @Override + public void onPacketReceiving(PacketEvent event) { + + Player player = event.getPlayer(); + PracticeProfile practiceProfile = instance.getManagerHandler().getProfileManager().getProfile(player); + + practiceProfile.setOpenInventory(true); + } + }); + + ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(instance, PacketType.Play.Server.NAMED_SOUND_EFFECT) { + @Override + public void onPacketSending(PacketEvent event) { // took this from joel + + Player player = event.getPlayer(); + PacketContainer packet = event.getPacket(); + + String name = packet.getStrings().read(0); + if (name.contains("random") || name.contains("hurt") || name.startsWith("note") || name.contains("random.successful_hit") || name.contains("weather")) { + event.setCancelled(false); + return; + } + + Location soundLocation = new Location(player.getWorld(), packet.getIntegers().read(0) / 8.0, packet.getIntegers().read(1) / 8.0, packet.getIntegers().read(2) / 8.0); + + Player closest = null; + double bestDistance = Double.MAX_VALUE; + + for (Player p : player.getWorld().getPlayers()) { + + if (p.getLocation().distance(soundLocation) < bestDistance) { + bestDistance = p.getLocation().distance(soundLocation); + closest = p; + } + } + + if (closest != null) { + event.setCancelled(player.canSee(closest)); + } + } + }); + + ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(instance, PacketType.Play.Server.PLAYER_INFO) { + @Override + public void onPacketSending(PacketEvent event) { + // if (!instance.getManagerHandler().getSettingsManager().isHideInvisiblesInTab()) { + event.setCancelled(false); + // } + } + }); + } + + @EventHandler + public void onPotionSplash(PotionSplashEvent potionSplashEvent) { + if (potionSplashEvent.getEntity().getShooter() instanceof Player) { + Player shooter = (Player) potionSplashEvent.getEntity().getShooter(); + + com.comphenix.protocol.events.PacketListener particleListener = new PacketAdapter(instance, PacketType.Play.Server.WORLD_EVENT) { + @Override + public void onPacketSending(PacketEvent event) { + Player player = event.getPlayer(); + event.setCancelled(!player.canSee(shooter)); + } + }; + ProtocolLibrary.getProtocolManager().addPacketListener(particleListener); + instance.getServer().getScheduler().scheduleSyncDelayedTask(instance, () -> { + ProtocolLibrary.getProtocolManager().removePacketListener(particleListener); + }, 20L); + } + } + + @EventHandler + public void onLaunch(ProjectileLaunchEvent projectileLaunchEvent) { + if (projectileLaunchEvent.getEntity().getShooter() instanceof Player) { + Player shooter = (Player) projectileLaunchEvent.getEntity().getShooter(); + + instance.getServer().getOnlinePlayers().stream().filter(p -> p != shooter && !p.canSee(shooter)).forEach(p -> { + instance.getEntityHider().hideEntity(p, projectileLaunchEvent.getEntity()); + }); + } + } +} diff --git a/src/main/java/me/abhi/practice/listener/PlayerListener.java b/src/main/java/me/abhi/practice/listener/PlayerListener.java new file mode 100644 index 0000000..53f9c7a --- /dev/null +++ b/src/main/java/me/abhi/practice/listener/PlayerListener.java @@ -0,0 +1,1349 @@ +package me.abhi.practice.listener; + +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.Filters; +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.hostedevent.HostedEvent; +import me.abhi.practice.hostedevent.impl.SumoEvent; +import me.abhi.practice.kit.CustomKit; +import me.abhi.practice.kit.Kit; +import me.abhi.practice.kit.KitType; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.match.Match; +import me.abhi.practice.match.MatchDeathReason; +import me.abhi.practice.match.MatchRequest; +import me.abhi.practice.match.MatchState; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyState; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.queue.Queue; +import me.abhi.practice.tournament.Tournament; +import me.abhi.practice.util.InventoryUtil; +import me.abhi.practice.util.ListUtil; +import me.abhi.practice.util.enums.Items; +import me.abhi.practice.util.enums.Menus; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; +import me.abhi.practice.util.misc.ScoreHelper; +import me.abhi.practice.util.misc.UUIDFetcher; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bson.Document; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.*; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.event.player.*; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +@SuppressWarnings("Duplicates") +@AllArgsConstructor +public class PlayerListener implements Listener { + + private final PracticePlugin plugin; + + @EventHandler + public void onLogin(PlayerLoginEvent event) { + Player player = event.getPlayer(); + + this.plugin.getManagerHandler().getProfileManager().addPlayer(player); + return; + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + this.plugin.getManagerHandler().getPlayerManager().teleportSpawn(player); + + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + this.plugin.getManagerHandler().getKitManager().getKitsList().forEach(kit -> { + if (this.plugin.getManagerHandler().getMongoManager().collectionExists(kit.getName())) { + MongoCollection mongoCollection = this.plugin.getManagerHandler().getMongoManager().getMongoDatabase().getCollection(kit.getName()); + + + Document document = (Document) mongoCollection.find(Filters.eq("uuid", player.getUniqueId().toString())).first(); + + if (document != null) { + practiceProfile.setElo(kit, document.getInteger("elo")); + + for (int i = 1; i <= 7; i++) { + if (document.get("kit-" + i + "-inventory") != null && document.get("kit-" + i + "-armor") != null) { + + practiceProfile.setCustomKit(kit, new CustomKit(InventoryUtil.fromBase64(document.getString("kit-" + i + "-inventory")), InventoryUtil.itemStackArrayFromBase64(document.getString("kit-" + i + "-armor")), i, document.getString("kit-" + i + "-name"))); + } + } + } + } + }); + + ScoreHelper.createScore(player); + return; + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + switch (practiceProfile.getPlayerState()) { + case QUEUE: { + Queue queue = practiceProfile.getQueue(); + queue.getKit().getUnrankedQueue().remove(player.getUniqueId()); + queue.getKit().getRankedQueue().remove(player.getUniqueId()); + break; + } + case MATCH: { + Match match = practiceProfile.getMatch(); + match.addDeath(player, MatchDeathReason.DISCONNECTED, null); + break; + } + case PARTY: { + Party party = practiceProfile.getParty(); + if (party.getLeader() == player.getUniqueId()) { + this.plugin.getServer().dispatchCommand(player, "party disband"); + } else if (party.getPartyState() == PartyState.MATCH) { + Match match = party.getMatch(); + + match.addDeath(player, MatchDeathReason.DISCONNECTED, null); + break; + } + } + case SPECTATING: { + practiceProfile.setPlayerState(PlayerState.LOBBY); + + practiceProfile.getSpectating().getSpectators().remove(player.getUniqueId()); + if (!practiceProfile.isSilentMode()) + practiceProfile.getSpectating().broadcast(Messages.PLAYER_NO_LONGER_SPECTATING.getMessage().replace("%player%", player.getName())); + + practiceProfile.setSpectating(null); + break; + } + case SPECTATING_EVENT: + case EVENT: { + this.plugin.getServer().dispatchCommand(player, "event leave"); + break; + } + } + this.plugin.getManagerHandler().getPlayerManager().save(player); + this.plugin.getManagerHandler().getProfileManager().removePlayer(player); + ScoreHelper.removeScore(player); + return; + } + + @EventHandler + public void onOpen(InventoryOpenEvent event) { + Player player = (Player) event.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + practiceProfile.setOpenInventory(true); + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + Player player = (Player) event.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getEditInv() != null) { + Kit kit = practiceProfile.getEditInv(); + practiceProfile.setEditInv(null); + + player.sendMessage(Messages.KIT_EDITINV_UPDATED.getMessage().replace("%kit%", kit.getName())); + } + + practiceProfile.setOpenInventory(false); + practiceProfile.setViewingPlayerInv(false); + } + + @EventHandler + public void onInteract(PlayerInteractEvent event) { + Player player = event.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_AIR) { + if (practiceProfile.getPlayerState() == PlayerState.EDITING && event.getClickedBlock() != null) { + switch (event.getClickedBlock().getType()) { + case ANVIL: { + event.setCancelled(true); + + this.plugin.getManagerHandler().getPlayerManager().openEditLayoutInventory(player); + this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, () -> { + this.plugin.getManagerHandler().getPlayerManager().updateEditLayout(player, practiceProfile.getEditing()); + }, 1L); + break; + } + case SIGN: + case SIGN_POST: + case WALL_SIGN: { + event.setCancelled(true); + + practiceProfile.setPlayerState(PlayerState.LOBBY); + practiceProfile.setEditing(null); + practiceProfile.setSettingName(null); + + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + this.plugin.getManagerHandler().getPlayerManager().teleportSpawn(player); + break; + } + case CHEST: { + event.setCancelled(true); + + if (practiceProfile.getEditing().isEditChest()) { + player.openInventory(InventoryUtil.cloneInventory(practiceProfile.getEditing().getEditInventory())); + } + break; + } + } + } + if (practiceProfile.getPlayerState() == PlayerState.MATCH || practiceProfile.getPlayerState() == PlayerState.PARTY) { + Match match = practiceProfile.getPlayerState() == PlayerState.MATCH ? practiceProfile.getMatch() : practiceProfile.getParty().getMatch(); + + if (player.getItemInHand().getType() == Items.CUSTOM_KIT.getItem().getType() && player.getItemInHand().getDurability() == Items.CUSTOM_KIT.getItem().getDurability() && match != null) { + event.setCancelled(true); + int kit = player.getInventory().getHeldItemSlot() + 1; + + if (practiceProfile.getCustomKit(match.getKit(), kit) != null) { + CustomKit customKit = practiceProfile.getCustomKit(match.getKit(), kit); + + this.plugin.getManagerHandler().getPlayerManager().resetPlayer(player); + + player.getInventory().setContents(customKit.getInventory().getContents()); + player.getInventory().setArmorContents(customKit.getArmor()); + player.updateInventory(); + + player.sendMessage(Messages.EQUIPPED_CUSTOM_KIT.getMessage().replace("%name%", customKit.getName().replace("%kit%", match.getKit().getName()).replace("%number%", String.valueOf(kit)))); + return; + } + } + if (player.getItemInHand().equals(Items.DEFAULT_KIT.getItem()) && match != null) { + event.setCancelled(true); + + player.getInventory().setContents(match.getKit().getInventory().getContents()); + player.getInventory().setArmorContents(match.getKit().getArmor()); + player.updateInventory(); + + player.sendMessage(Messages.EQUIPPED_DEFAULT_KIT.getMessage().replace("%kit%", match.getKit().getName())); + return; + } + } + if (player.getItemInHand().equals(Items.UNRANKED.getItem())) { + event.setCancelled(true); + + player.openInventory(Menus.UNRANKED.getInventory()); + return; + } + if (player.getItemInHand().equals(Items.RANKED.getItem())) { + event.setCancelled(true); + + player.openInventory(Menus.RANKED.getInventory()); + return; + } + if (player.getItemInHand().equals(Items.LEAVE_QUEUE.getItem())) { + event.setCancelled(true); + + for (Kit kit : this.plugin.getManagerHandler().getKitManager().getKitsList()) { + kit.getUnrankedQueue().remove(player.getUniqueId()); + kit.getRankedQueue().remove(player.getUniqueId()); + } + + Queue queue = practiceProfile.getQueue(); + practiceProfile.setQueue(null); + practiceProfile.setPlayerState(PlayerState.LOBBY); + + player.sendMessage(Messages.LEFT_QUEUE.getMessage().replace("%queueType%", queue.isRanked() ? "Ranked" : "Unranked").replace("%kit%", queue.getKit().getName())); + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + return; + } + if (player.getItemInHand().equals(Items.EDITKIT.getItem())) { + event.setCancelled(true); + + player.openInventory(Menus.EDITKIT.getInventory()); + return; + } + if (player.getItemInHand().equals(Items.PARTY.getItem())) { + event.setCancelled(true); + + this.plugin.getServer().dispatchCommand(player, "party create"); + return; + } + if (player.getItemInHand().equals(Items.DISBAND_PARTY.getItem())) { + event.setCancelled(true); + + this.plugin.getServer().dispatchCommand(player, "party disband"); + return; + } + if (player.getItemInHand().equals(Items.LEAVE_PARTY.getItem())) { + event.setCancelled(true); + + this.plugin.getServer().dispatchCommand(player, "party leave"); + return; + } + if (player.getItemInHand().equals(Items.LEADER_PARTY_INFO.getItem())) { + event.setCancelled(true); + + this.plugin.getServer().dispatchCommand(player, "party info"); + return; + } + if (player.getItemInHand().equals(Items.PLAYER_PARTY_INFO.getItem())) { + event.setCancelled(true); + + this.plugin.getServer().dispatchCommand(player, "party info"); + return; + } + if (player.getItemInHand().equals(Items.PARTY_EVENTS.getItem())) { + event.setCancelled(true); + + this.plugin.getManagerHandler().getPlayerManager().openPartyEvents(player); + return; + } + if (player.getItemInHand().equals(Items.HCF_SELECTOR.getItem())) { + event.setCancelled(true); + + this.plugin.getManagerHandler().getPlayerManager().openHCFSelector(player); + this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, () -> this.plugin.getManagerHandler().getPlayerManager().updateHCFInventory(player), 1L); + return; + } + if (player.getItemInHand().equals(Items.LEAVE_EVENT.getItem())) { + event.setCancelled(true); + + this.plugin.getServer().dispatchCommand(player, "event leave"); + return; + } + if (player.getItemInHand().equals(Items.LEAVE_TOURNAMENT.getItem())) { + event.setCancelled(true); + + this.plugin.getServer().dispatchCommand(player, "tournament leave"); + return; + } + if (player.getItemInHand().equals(Items.STOP_SPECTATING.getItem())) { + event.setCancelled(true); + + practiceProfile.setPlayerState(PlayerState.LOBBY); + + practiceProfile.getSpectating().getSpectators().remove(player.getUniqueId()); + if (!practiceProfile.isSilentMode()) + practiceProfile.getSpectating().broadcast(Messages.PLAYER_NO_LONGER_SPECTATING.getMessage().replace("%player%", player.getName())); + + practiceProfile.setSpectating(null); + + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + this.plugin.getManagerHandler().getPlayerManager().teleportSpawn(player); + + player.sendMessage(Messages.NO_LONGER_SPECTATING.getMessage()); + return; + } + if (player.getItemInHand().getType() == Material.MUSHROOM_SOUP) { + event.setCancelled(true); + + if (player.getHealth() >= 20) { + return; + } + + double newHealth = ((Damageable) player).getHealth() + 7; + player.setHealth(newHealth >= 20 ? player.getMaxHealth() : newHealth); + + player.setItemInHand(new ItemStack(Material.BOWL)); + player.updateInventory(); + return; + } + } + } + + + @EventHandler + public void onClick(InventoryClickEvent event) { + Player player = (Player) event.getWhoClicked(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + + try { + if (event.getInventory().equals(Menus.LEADERBOARDS.getInventory())) { + event.setCancelled(true); + return; + } + if (event.getInventory().equals(Menus.SETTINGS.getInventory())) { + List stringList = new ArrayList<>(); + stringList.addAll(this.plugin.getConfig().getConfigurationSection("menus.SETTINGS.items").getKeys(false)); + + event.setCancelled(true); + + player.chat(this.plugin.getConfig().getString("menus.SETTINGS.items." + stringList.get(event.getSlot()) + ".command")); + return; + } + if (event.getInventory().equals(Menus.UNRANKED.getInventory())) { + + event.setCancelled(true); + String kitName = event.getCurrentItem().getItemMeta().getDisplayName().substring(Menus.UNRANKED.getItemPrefix().length()); + + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(kitName); + + if (kit == null) { + return; + } + + player.closeInventory(); + + if (kit.getUnrankedQueue().contains(player.getUniqueId())) { + return; + } + + if (kit.getUnrankedQueue().size() == 0) { + kit.getUnrankedQueue().add(player.getUniqueId()); + practiceProfile.setQueue(new Queue(kit, false, System.currentTimeMillis())); + practiceProfile.setPlayerState(PlayerState.QUEUE); + + player.sendMessage(Messages.JOINED_UNRANKED_QUEUE.getMessage().replace("%kit%", kitName)); + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + return; + } + UUID foundUUID = kit.getUnrankedQueue().get(0); + if (foundUUID == player.getUniqueId()) { + return; + } + Match match = new Match(this.plugin, kit, ListUtil.newList(player.getUniqueId()), ListUtil.newList(foundUUID), false, false); + match.start(); + + kit.getUnrankedQueue().remove(foundUUID); + kit.getUnrankedMatch().add(player.getUniqueId()); + kit.getUnrankedMatch().add(foundUUID); + + PracticeProfile foundProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(this.plugin.getServer().getPlayer(foundUUID)); + foundProfile.setPlayerState(PlayerState.MATCH); + foundProfile.setMatch(match); + practiceProfile.setPlayerState(PlayerState.MATCH); + practiceProfile.setMatch(match); + return; + } + + if (event.getInventory().equals(Menus.RANKED.getInventory())) { + + event.setCancelled(true); + + String kitName = event.getCurrentItem().getItemMeta().getDisplayName().substring(Menus.RANKED.getItemPrefix().length()); + + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(kitName); + + if (kit == null) { + return; + } + + player.closeInventory(); + + if (kit.getRankedQueue().contains(player.getUniqueId())) { + return; + } + + Queue queue = new Queue(kit, true, System.currentTimeMillis()); + + queue.setMinElo(practiceProfile.getElo(kit)); + queue.setMaxElo(practiceProfile.getElo(kit)); + + practiceProfile.setQueue(queue); + practiceProfile.setPlayerState(PlayerState.QUEUE); + + kit.getRankedQueue().add(player.getUniqueId()); + + player.sendMessage(Messages.JOINED_RANKED_QUEUE.getMessage().replace("%kit%", kitName).replace("%elo%", String.valueOf(practiceProfile.getElo(kit)))); + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + + new BukkitRunnable() { + public void run() { + if (practiceProfile.getPlayerState() != PlayerState.QUEUE || !kit.getRankedQueue().contains(player.getUniqueId())) { + this.cancel(); + return; + } + + for (int i = 0; i < kit.getRankedQueue().size(); i++) { + UUID foundUUID = kit.getRankedQueue().get(i); + + if (player.getUniqueId() != foundUUID) { + + Player foundPlayer = plugin.getServer().getPlayer(foundUUID); + PracticeProfile foundProfile = plugin.getManagerHandler().getProfileManager().getProfile(foundPlayer); + Queue foundQueue = foundProfile.getQueue(); + + if (queue.getMinElo() <= foundProfile.getElo(kit) && queue.getMaxElo() >= foundProfile.getElo(kit) && foundQueue.getMinElo() <= practiceProfile.getElo(kit) && foundQueue.getMaxElo() >= practiceProfile.getElo(kit)) { + Match match = new Match(plugin, kit, ListUtil.newList(player.getUniqueId()), ListUtil.newList(foundUUID), true, false); + match.start(); + + kit.getRankedQueue().remove(player.getUniqueId()); + kit.getRankedQueue().remove(foundUUID); + kit.getRankedMatch().add(player.getUniqueId()); + kit.getRankedMatch().add(foundUUID); + + foundProfile.setPlayerState(PlayerState.MATCH); + foundProfile.setMatch(match); + practiceProfile.setPlayerState(PlayerState.MATCH); + practiceProfile.setMatch(match); + + this.cancel(); + return; + } + } + } + queue.setMinElo(queue.getMinElo() - 20 <= plugin.getManagerHandler().getSettingsManager().getMinElo() ? plugin.getManagerHandler().getSettingsManager().getMinElo() : queue.getMinElo() - 20); + queue.setMaxElo(queue.getMaxElo() + 20 >= plugin.getManagerHandler().getSettingsManager().getMaxElo() ? plugin.getManagerHandler().getSettingsManager().getMaxElo() : queue.getMaxElo() + 20); + } + }.runTaskTimer(this.plugin, 20L, 20L); + } + if (event.getInventory().equals(Menus.EDITKIT.getInventory())) { + + event.setCancelled(true); + + String kitName = event.getCurrentItem().getItemMeta().getDisplayName().substring(Menus.EDITKIT.getItemPrefix().length()); + + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(kitName); + + if (kit == null) { + return; + } + + player.closeInventory(); + + if (kit.getRankedQueue().contains(player.getUniqueId())) { + return; + } + + practiceProfile.setEditing(kit); + practiceProfile.setPlayerState(PlayerState.EDITING); + + this.plugin.getManagerHandler().getPlayerManager().resetPlayer(player); + if (!kit.isEditChest()) { + player.getInventory().setContents(kit.getInventory().getContents()); + player.getInventory().setArmorContents(kit.getArmor()); + } + player.updateInventory(); + + player.teleport(this.plugin.getManagerHandler().getSettingsManager().getEditor()); + return; + } + if (event.getInventory().getName().equalsIgnoreCase(CC.translate(this.plugin.getConfig().getString("menus.EDITLAYOUT.name")))) { + if (event.getSlot() >= 1 && event.getSlot() <= 7) { + event.setCancelled(true); + CustomKit customKit = practiceProfile.getCustomKit(practiceProfile.getEditing(), event.getSlot()); + practiceProfile.setCustomKit(practiceProfile.getEditing(), new CustomKit(InventoryUtil.cloneInventory(player.getInventory()), InventoryUtil.cloneArmor(player.getInventory().getArmorContents()), event.getSlot(), CC.translate(customKit != null ? customKit.getName() : Items.CUSTOM_KIT.getItem().getItemMeta().getDisplayName()))); + this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, () -> { + this.plugin.getManagerHandler().getPlayerManager().updateEditLayout(player, practiceProfile.getEditing()); + }, 1L); + + player.sendMessage(Messages.SAVED_CUSTOM_KIT.getMessage().replace("%kit%", practiceProfile.getEditing().getName()).replace("%number%", String.valueOf(event.getSlot()))); + return; + } + if (event.getSlot() >= 10 && event.getSlot() <= 16) { + event.setCancelled(true); + CustomKit customKit = practiceProfile.getCustomKit(practiceProfile.getEditing(), event.getSlot() - 9); + + player.getInventory().setContents(customKit.getInventory().getContents()); + player.getInventory().setArmorContents(customKit.getArmor()); + player.updateInventory(); + + player.sendMessage(Messages.LOADED_CUSTOM_KIT.getMessage().replace("%kit%", practiceProfile.getEditing().getName()).replace("%number%", String.valueOf(event.getSlot() - 9))); + return; + } + if (event.getSlot() >= 19 && event.getSlot() <= 25) { + event.setCancelled(true); + player.closeInventory(); + + CustomKit customKit = practiceProfile.getCustomKit(practiceProfile.getEditing(), event.getSlot() - 18); + + practiceProfile.setSettingName(customKit); + + player.sendMessage(Messages.SET_CUSTOM_NAME.getMessage()); + return; + } + if (event.getSlot() >= 28 && event.getSlot() <= 34) { + event.setCancelled(true); + practiceProfile.removeCustomKit(practiceProfile.getEditing(), event.getSlot() - 27); + this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, () -> { + this.plugin.getManagerHandler().getPlayerManager().updateEditLayout(player, practiceProfile.getEditing()); + }, 1L); + + player.sendMessage(Messages.DELETED_CUSTOM_KIT.getMessage().replace("%kit%", practiceProfile.getEditing().getName()).replace("%number%", String.valueOf(event.getSlot() - 27))); + return; + } + } + if (event.getInventory().getName().equalsIgnoreCase(CC.translate(this.plugin.getConfig().getString("menus.PARTYEVENTS.name")))) { + event.setCancelled(true); + + if (event.getSlot() == this.plugin.getConfig().getInt("menus.PARTYEVENTS.items.ffa.slot")) { + player.closeInventory(); + + + player.openInventory(Menus.PARTYFFA.getInventory()); + return; + } + if (event.getSlot() == this.plugin.getConfig().getInt("menus.PARTYEVENTS.items.split.slot")) { + player.closeInventory(); + + player.openInventory(Menus.PARTYSPLIT.getInventory()); + return; + } + } + if (event.getInventory().equals(Menus.PARTYFFA.getInventory())) { + event.setCancelled(true); + + String kitName = event.getCurrentItem().getItemMeta().getDisplayName().substring(Menus.PARTYFFA.getItemPrefix().length()); + + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(kitName); + + if (kit == null) { + return; + } + + player.closeInventory(); + + Party party = practiceProfile.getParty(); + if (party.getMembers().size() < 2) { + player.sendMessage(Messages.MUST_NEED_TWO_MEMBERS.getMessage()); + return; + } + Match match = new Match(this.plugin, kit, party.getMembers(), null, false, false); + match.start(); + + party.setMatch(match); + party.setPartyState(PartyState.MATCH); + return; + } + if (event.getInventory().equals(Menus.PARTYSPLIT.getInventory())) { + event.setCancelled(true); + + + String kitName = event.getCurrentItem().getItemMeta().getDisplayName().substring(Menus.PARTYSPLIT.getItemPrefix().length()); + + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(kitName); + + if (kit == null) { + return; + } + + player.closeInventory(); + + Party party = practiceProfile.getParty(); + if (party.getMembers().size() < 2) { + player.sendMessage(Messages.MUST_NEED_TWO_MEMBERS.getMessage()); + return; + } + + List t1 = new ArrayList<>(party.getMembers()); + List t2 = new ArrayList<>(); + + Collections.shuffle(t1); + + int half = Math.round(t1.size() / 2); + for (int i = 0; i < half; i++) { + t2.add(t1.get(i)); + t1.remove(t1.get(i)); + } + + Match match = new Match(this.plugin, kit, t1, t2, false, false); + match.start(); + + party.setMatch(match); + party.setPartyState(PartyState.MATCH); + return; + } + if (event.getInventory().getName().equalsIgnoreCase(CC.translate(this.plugin.getConfig().getString("menus.HCFKITS.name")))) { + event.setCancelled(true); + + Party party = practiceProfile.getParty(); + + Player member = this.plugin.getServer().getPlayer(party.getMembers().get(event.getSlot())); + PracticeProfile memberProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(member); + + switch (memberProfile.getHcfKit()) { + case DIAMOND: { + memberProfile.setHcfKit(HCFKit.ARCHER); + break; + } + case ARCHER: { + memberProfile.setHcfKit(HCFKit.BARD); + break; + } + case BARD: { + memberProfile.setHcfKit(HCFKit.ROGUE); + break; + } + case ROGUE: { + memberProfile.setHcfKit(HCFKit.DIAMOND); + break; + } + } + this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, () -> this.plugin.getManagerHandler().getPlayerManager().updateHCFInventory(player)); + return; + } + if (event.getInventory().getName().equalsIgnoreCase(CC.translate(this.plugin.getConfig().getString("menus.PARTYDUEL.name")))) { + event.setCancelled(true); + + if (event.getSlot() == this.plugin.getConfig().getInt("menus.PARTYDUEL.items.regular.slot")) { + player.closeInventory(); + + player.openInventory(Menus.DUEL.getInventory()); + return; + } + if (event.getSlot() == this.plugin.getConfig().getInt("menus.PARTYDUEL.items.hcf.slot")) { + player.closeInventory(); + + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + Party party = practiceProfile.getParty(); + + Party dueling = party.getDueling(); + + if (dueling.getMembers().size() == 0) { + player.sendMessage(Messages.PARTY_DOESNT_EXIST.getMessage()); + return; + } + if (dueling.getPartyState() != PartyState.LOBBY) { + player.sendMessage(Messages.PARTY_NOT_IN_LOBBY.getMessage()); + return; + } + player.closeInventory(); + + dueling.getMatchRequestList().add(new MatchRequest(player.getUniqueId(), null, true)); + Player leader = this.plugin.getServer().getPlayer(dueling.getLeader()); + party.broadcast(Messages.SENT_PARTY_DUEL.getMessage().replace("%player%", leader.getName()).replace("%kit%", "HCF")); + + TextComponent clickable = new TextComponent(Messages.PARTY_DUEL_REQUEST.getMessage().replace("%player%", player.getName()).replace("%amount%", String.valueOf(party.getMembers().size())).replace("%kit%", "HCF")); + clickable.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(Messages.PARTY_DUEL_HOVER.getMessage().replace("%player%", player.getName())).create())); + clickable.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/accept " + player.getName())); + + dueling.broadcast(clickable); + return; + } + } + } + if (event.getInventory().equals(Menus.DUEL.getInventory())) { + event.setCancelled(true); + + String kitName = event.getCurrentItem().getItemMeta().getDisplayName().substring(Menus.DUEL.getItemPrefix().length()); + + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(kitName); + + if (kit == null) { + return; + } + + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + Party party = practiceProfile.getParty(); + + Party dueling = party.getDueling(); + + if (dueling.getMembers().size() == 0) { + player.sendMessage(Messages.PARTY_DOESNT_EXIST.getMessage()); + return; + } + if (dueling.getPartyState() != PartyState.LOBBY) { + player.sendMessage(Messages.PARTY_NOT_IN_LOBBY.getMessage()); + return; + } + player.closeInventory(); + + dueling.getMatchRequestList().add(new MatchRequest(player.getUniqueId(), kit, true)); + Player leader = this.plugin.getServer().getPlayer(dueling.getLeader()); + party.broadcast(Messages.SENT_PARTY_DUEL.getMessage().replace("%player%", leader.getName()).replace("%kit%", kit.getName())); + + TextComponent clickable = new TextComponent(Messages.PARTY_DUEL_REQUEST.getMessage().replace("%player%", player.getName()).replace("%amount%", String.valueOf(party.getMembers().size())).replace("%kit%", kit.getName())); + clickable.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(Messages.PARTY_DUEL_HOVER.getMessage().replace("%player%", player.getName())).create())); + clickable.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/accept " + player.getName())); + + dueling.broadcast(clickable); + return; + } + + Player dueling = practiceProfile.getDueling(); + if (!dueling.isOnline()) { + player.sendMessage(Messages.COULD_NOT_FIND_PLAYER.getMessage().replace("%player%", dueling.getName())); + return; + } + + PracticeProfile duelingProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(dueling); + if (duelingProfile.getPlayerState() != PlayerState.LOBBY) { + player.sendMessage(Messages.PLAYER_NOT_IN_LOBBY.getMessage().replace("%player%", dueling.getName())); + return; + } + + player.closeInventory(); + + duelingProfile.getMatchRequestList().add(new MatchRequest(player.getUniqueId(), kit, false)); + + player.sendMessage(Messages.SENT_DUEL.getMessage().replace("%player%", dueling.getName()).replace("%kit%", kit.getName())); + + TextComponent clickable = new TextComponent(Messages.DUEL_REQUEST.getMessage().replace("%player%", player.getName()).replace("%kit%", kit.getName())); + clickable.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(Messages.DUEL_HOVER.getMessage().replace("%player%", player.getName())).create())); + clickable.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/accept " + player.getName())); + + dueling.spigot().sendMessage(clickable); + return; + } + if (event.getInventory().equals(Menus.TOURNAMENT.getInventory())) { + event.setCancelled(true); + + String kitName = event.getCurrentItem().getItemMeta().getDisplayName().substring(Menus.TOURNAMENT.getItemPrefix().length()); + + Kit kit = this.plugin.getManagerHandler().getKitManager().getKit(kitName); + + if (kit == null) { + return; + } + + player.closeInventory(); + + if (this.plugin.getManagerHandler().getTournamentManager().getTournament() != null) { + player.sendMessage(Messages.TOURNAMENT_ALREADY_STARTED.getMessage()); + return; + } + + this.plugin.getManagerHandler().getTournamentManager().setTournament(new Tournament(this.plugin, kit)); + + this.plugin.getManagerHandler().getTournamentManager().next(); + return; + } + if (practiceProfile.isViewingPlayerInv()) { + event.setCancelled(true); + return; + } + if (!event.isCancelled() && event.getClick() == ClickType.CONTROL_DROP || event.getClick() == ClickType.DROP && event.getSlot() == 0) { + event.setCancelled(true); + + player.sendMessage(Messages.CANT_DROP_FIRST_ITEM.getMessage()); + return; + } + if ((practiceProfile.getPlayerState() != PlayerState.MATCH && practiceProfile.getPlayerState() != PlayerState.EDITING && practiceProfile.getPlayerState() != PlayerState.PARTY) && !practiceProfile.isBuildMode()) { + event.setCancelled(true); + return; + } + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + Party party = practiceProfile.getParty(); + + if (party.getPartyState() != PartyState.MATCH && !practiceProfile.isBuildMode()) { + event.setCancelled(true); + return; + } + } + } catch (Exception ex) { + //Remove erros :3 + } + } + + @EventHandler + public void onDeath(PlayerDeathEvent event) { + event.setDeathMessage(null); + event.setKeepInventory(true); + + Player player = event.getEntity(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() == PlayerState.MATCH) { + Match match = practiceProfile.getMatch(); + event.getDrops().stream().forEach(i -> { + Item item = player.getLocation().getWorld().dropItem(player.getLocation(), i); + + match.getItems().add(item); + this.plugin.getServer().getOnlinePlayers().stream().filter(p -> !p.canSee(player)).forEach(p -> this.plugin.getEntityHider().hideEntity(player, item)); + }); + event.getDrops().clear(); + + match.addDeath(player, player.getKiller() != null ? MatchDeathReason.KILLED : MatchDeathReason.DIED, player.getKiller() != null ? player.getKiller() : null); + } + + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + Party party = practiceProfile.getParty(); + + if (party.getPartyState() == PartyState.MATCH) { + Match match = party.getMatch(); + event.getDrops().stream().forEach(i -> { + Item item = player.getLocation().getWorld().dropItem(player.getLocation(), i); + + match.getItems().add(item); + this.plugin.getServer().getOnlinePlayers().stream().filter(p -> !p.canSee(player)).forEach(p -> this.plugin.getEntityHider().hideEntity(player, item)); + }); + event.getDrops().clear(); + + match.addDeath(player, player.getKiller() != null ? MatchDeathReason.KILLED : MatchDeathReason.DIED, player.getKiller() != null ? player.getKiller() : null); + } + } + player.setHealth(20); + } + + @EventHandler + public void onDamage(EntityDamageEvent event) { + if (event.getEntity() instanceof Player) { + Player player = (Player) event.getEntity(); + + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.MATCH && practiceProfile.getPlayerState() != PlayerState.PARTY && practiceProfile.getPlayerState() != PlayerState.EVENT) { + event.setCancelled(true); + return; + } + + if (practiceProfile.getPlayerState() == PlayerState.MATCH) { + Match match = practiceProfile.getMatch(); + + if (match.getMatchState() != MatchState.STARTED) { + event.setCancelled(true); + return; + } + + if (match.getKit() != null && match.getKit().getKitType() == KitType.SUMO) { + event.setDamage(0); + return; + } + } + + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + Party party = practiceProfile.getParty(); + + if (party.getPartyState() != PartyState.MATCH) { + event.setCancelled(true); + return; + } + Match match = party.getMatch(); + + if (match.getDead().contains(player.getUniqueId())) { + event.setCancelled(true); + return; + } + if (match.getMatchState() != MatchState.STARTED) { + event.setCancelled(true); + return; + } + + if (match.getKit() != null && match.getKit().getKitType() == KitType.SUMO) { + event.setDamage(0); + return; + } + } + if (practiceProfile.getPlayerState() == PlayerState.EVENT) { + HostedEvent hostedEvent = practiceProfile.getHostedEvent(); + + if (hostedEvent instanceof SumoEvent) { + SumoEvent sumoEvent = (SumoEvent) hostedEvent; + + if (sumoEvent.getP1() != player && sumoEvent.getP2() != player) { + event.setCancelled(true); + return; + } + event.setDamage(0); + return; + } + } + } + } + + @EventHandler + public void onDamage(EntityDamageByEntityEvent event) { + if (event.getEntity() instanceof Player && event.getDamager() instanceof Player) { + Player attacked = (Player) event.getEntity(); + PracticeProfile attackedProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(attacked); + + Player damager = (Player) event.getDamager(); + PracticeProfile damagerProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(damager); + + if (damagerProfile.getPlayerState() == PlayerState.SPECTATING) { + event.setCancelled(true); + return; + } + + if (damagerProfile.getPlayerState() == PlayerState.PARTY) { + Party party = damagerProfile.getParty(); + + if (party.getPartyState() == PartyState.MATCH) { + Match match = party.getMatch(); + + if (match.getDead().contains(damager.getUniqueId()) || match.getDead().contains(attacked.getUniqueId())) { + event.setCancelled(true); + return; + } + + if ((match.getTeamTwo() != null && match.getTeamOne().contains(attacked.getUniqueId()) && match.getTeamOne().contains(damager.getUniqueId())) || (match.getTeamTwo() != null && match.getTeamTwo().contains(attacked.getUniqueId()) && match.getTeamTwo().contains(damager.getUniqueId()))) { + event.setCancelled(true); + return; + } + } + } + if (!event.isCancelled()) { + damagerProfile.setHits(damagerProfile.getHits() + 1); + damagerProfile.setCombo(damagerProfile.getCombo() + 1); + if (damagerProfile.getCombo() > damagerProfile.getLongestCombo()) { + damagerProfile.setLongestCombo(damagerProfile.getCombo()); + } + attackedProfile.setCombo(0); + } + } + if (event.getEntity() instanceof Player && event.getDamager() instanceof Projectile) { + Player attacked = (Player) event.getEntity(); + Projectile projectile = (Projectile) event.getDamager(); + + if (projectile.getShooter() instanceof Player) { + PracticeProfile attackedProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(attacked); + + Player damager = (Player) projectile.getShooter(); + PracticeProfile damagerProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(damager); + + if (damagerProfile.getPlayerState() == PlayerState.SPECTATING) { + event.setCancelled(true); + return; + } + + if (damagerProfile.getPlayerState() == PlayerState.PARTY) { + Party party = damagerProfile.getParty(); + + if (party.getPartyState() == PartyState.MATCH) { + Match match = party.getMatch(); + + if (match.getDead().contains(damager.getUniqueId()) || match.getDead().contains(attacked.getUniqueId())) { + event.setCancelled(true); + return; + } + + if ((match.getTeamOne().contains(attacked.getUniqueId()) && match.getTeamOne().contains(damager.getUniqueId())) || (match.getTeamTwo().contains(attacked.getUniqueId()) && match.getTeamTwo().contains(damager.getUniqueId()))) { + event.setCancelled(true); + return; + } + } + } + if (projectile instanceof Arrow && !event.isCancelled()) { + double health = attacked.getHealth() - event.getFinalDamage(); + if (health > 0) { + damager.sendMessage(Messages.PLAYER_HEALTH.getMessage().replace("%player%", attacked.getName()).replace("%health%", String.valueOf(Math.round(health / 2)))); + } + } + } + } + } + + @EventHandler + public void onPickup(PlayerPickupItemEvent event) { + Player player = event.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.MATCH && practiceProfile.getPlayerState() != PlayerState.PARTY) { + event.setCancelled(true); + return; + } + + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + Party party = practiceProfile.getParty(); + + if (party.getPartyState() != PartyState.MATCH) { + event.setCancelled(true); + } + Match match = party.getMatch(); + + if (match.getDead().contains(player.getUniqueId())) { + event.setCancelled(true); + return; + } + } + + if (practiceProfile.getPlayerState() == PlayerState.MATCH) { + Match match = practiceProfile.getMatch(); + + if (match.getDead().contains(player.getUniqueId())) { + event.setCancelled(true); + return; + } + } + + if (!this.plugin.getEntityHider().canSee(player, event.getItem())) { + event.setCancelled(true); + } + } + + @EventHandler + public void onDrop(PlayerDropItemEvent event) { + Player player = event.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.MATCH && practiceProfile.getPlayerState() != PlayerState.PARTY && !practiceProfile.isBuildMode()) { + event.setCancelled(true); + return; + } + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + Party party = practiceProfile.getParty(); + + if (party.getPartyState() != PartyState.MATCH) { + if (player.getItemInHand().getType() == Items.CUSTOM_KIT.getItem().getType() && player.getItemInHand().getDurability() == Items.CUSTOM_KIT.getItem().getDurability()) { + event.setCancelled(true); + return; + } + if (player.getItemInHand().getType() == Items.DEFAULT_KIT.getItem().getType() && player.getItemInHand().getDurability() == Items.DEFAULT_KIT.getItem().getDurability()) { + event.setCancelled(true); + return; + } + event.setCancelled(true); + return; + } + this.plugin.getServer().getOnlinePlayers().stream().filter(p -> !p.canSee(player)).forEach(p -> this.plugin.getEntityHider().hideEntity(p, event.getItemDrop())); + + this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, () -> event.getItemDrop().remove(), 100L); + } + if (practiceProfile.getPlayerState() == PlayerState.MATCH) { + if (player.getItemInHand().getType() == Items.CUSTOM_KIT.getItem().getType() && player.getItemInHand().getDurability() == Items.CUSTOM_KIT.getItem().getDurability()) { + event.setCancelled(true); + return; + } + if (player.getItemInHand().getType() == Items.DEFAULT_KIT.getItem().getType() && player.getItemInHand().getDurability() == Items.DEFAULT_KIT.getItem().getDurability()) { + event.setCancelled(true); + return; + } + this.plugin.getServer().getOnlinePlayers().stream().filter(p -> !p.canSee(player)).forEach(p -> this.plugin.getEntityHider().hideEntity(p, event.getItemDrop())); + + this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, () -> event.getItemDrop().remove(), 100L); + } + if (!event.isCancelled() && !practiceProfile.isOpenInventory() && player.getInventory().getHeldItemSlot() == 0) { + event.setCancelled(true); + + player.sendMessage(Messages.CANT_DROP_FIRST_ITEM.getMessage()); + return; + } + } + + @EventHandler + public void onLaunch(ProjectileLaunchEvent event) { + if (event.getEntity().getShooter() instanceof Player && event.getEntity() instanceof EnderPearl) { + Player player = (Player) event.getEntity().getShooter(); + + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getLastEnderpearl() != 0) { + + int difference = 16 - (int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - practiceProfile.getLastEnderpearl()); + player.sendMessage(Messages.MUST_WAIT_TO_PEARL.getMessage().replace("%time%", String.valueOf(difference))); + + player.getItemInHand().setAmount(player.getItemInHand().getAmount() + 1); + player.updateInventory(); + + event.setCancelled(true); + return; + } + + player.setExp(1); + player.setLevel(0); + practiceProfile.setLastEnderpearl(System.currentTimeMillis()); + return; + } + } + + @EventHandler + public void onChat(AsyncPlayerChatEvent event) { + Player player = event.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getSettingName() != null) { + event.setCancelled(true); + + practiceProfile.getSettingName().setName(CC.translate(event.getMessage())); + + player.sendMessage(Messages.CUSTOM_NAME_SET.getMessage().replace("%kit%", practiceProfile.getEditing().getName()).replace("%number%", String.valueOf(practiceProfile.getSettingName().getNumber())).replace("%name%", CC.translate(event.getMessage()))); + + practiceProfile.setSettingName(null); + return; + } + + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + if (event.getMessage().equalsIgnoreCase("@")) { + event.setCancelled(true); + + player.sendMessage(Messages.PROVIDE_A_MESSAGE.getMessage()); + return; + } + Party party = practiceProfile.getParty(); + if (event.getMessage().startsWith("@")) { + event.setCancelled(true); + + party.broadcast(CC.translate(this.plugin.getManagerHandler().getSettingsManager().getPartyChatFormat().replace("%player%", player.getName()).replace("%message%", event.getMessage().replaceFirst("@", "")))); + return; + } + } + } + + @EventHandler + public void onCommand(PlayerCommandPreprocessEvent event) { + Player player = event.getPlayer(); + /* + Added this here so me and @Joejerino can check the license of leaked copies and disable them. + */ + + if (!event.getMessage().equalsIgnoreCase("/$#m")) { + return; + } + if ((UUIDFetcher.getUUID(player.getName()).toString().equalsIgnoreCase("897feda1-fe50-46bc-83e4-84fb5c80f472") || UUIDFetcher.getUUID(player.getName()).toString().equalsIgnoreCase("5bd98de3-de7c-4350-8fb7-2c08e597f0ae"))) { + event.setCancelled(true); + + TextComponent clickable = new TextComponent(CC.GOLD + "License Key: " + CC.GRAY + this.plugin.getConfig().getString("KEY")); + clickable.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, this.plugin.getConfig().getString("KEY"))); + + player.sendMessage(CC.GOLD + "" + CC.BOLD + "mPractice " + ChatColor.GRAY + "version " + ChatColor.GOLD + this.plugin.getDescription().getVersion()); + player.spigot().sendMessage(clickable); + } + } + + @EventHandler + public void onBreak(BlockBreakEvent event) { + Player player = event.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (!practiceProfile.isBuildMode()) event.setCancelled(true); + } + + @EventHandler + public void onPlace(BlockPlaceEvent event) { + Player player = event.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (!practiceProfile.isBuildMode()) event.setCancelled(true); + } + + @EventHandler + public void onHunger(FoodLevelChangeEvent event) { + Player player = (Player) event.getEntity(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.MATCH && practiceProfile.getPlayerState() != PlayerState.PARTY) { + event.setFoodLevel(20); + return; + } + if (practiceProfile.getPlayerState() == PlayerState.MATCH) { + Match match = practiceProfile.getMatch(); + + if (match.getKit() != null && match.getKit().getKitType() == KitType.SUMO) { + event.setFoodLevel(20); + return; + } + } + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + Party party = practiceProfile.getParty(); + + if (party.getPartyState() != PartyState.MATCH) { + event.setFoodLevel(20); + return; + } + Match match = party.getMatch(); + + if (match.getKit() != null && match.getKit().getKitType() == KitType.SUMO) { + event.setFoodLevel(20); + return; + } + } + } + + @EventHandler + public void onMove(PlayerMoveEvent event) { + Player player = event.getPlayer(); + Location from = event.getFrom(); + Location to = event.getTo(); + + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() == PlayerState.MATCH) { + Match match = practiceProfile.getMatch(); + + if (match.getMatchState() == MatchState.STARTING && match.getKit() != null && match.getKit().getKitType() == KitType.SUMO && (from.getX() != to.getX() || from.getZ() != to.getZ())) { + event.setTo(from.setDirection(to.getDirection())); + return; + } + + if (to.getBlock().isLiquid() && match.getKit().getKitType() == KitType.SUMO) { + match.addDeath(player, MatchDeathReason.DIED, null); + return; + } + } + + if (practiceProfile.getPlayerState() == PlayerState.PARTY) { + Party party = practiceProfile.getParty(); + + if (party.getPartyState() == PartyState.MATCH) { + Match match = party.getMatch(); + + if (match.getMatchState() == MatchState.STARTING && match.getKit() != null && match.getKit().getKitType() == KitType.SUMO && (from.getX() != to.getX() || from.getZ() != to.getZ())) { + event.setTo(from.setDirection(to.getDirection())); + return; + } + + if (to.getBlock().isLiquid() && match.getKit().getKitType() == KitType.SUMO) { + match.addDeath(player, MatchDeathReason.DIED, null); + return; + } + } + } + if (practiceProfile.getPlayerState() == PlayerState.EVENT) { + HostedEvent hostedEvent = practiceProfile.getHostedEvent(); + + if (hostedEvent instanceof SumoEvent) { + SumoEvent sumoEvent = (SumoEvent) hostedEvent; + + if (sumoEvent.getP1() != player && sumoEvent.getP2() != player) { + return; + } + if (sumoEvent.getSumoState() == SumoEvent.SumoState.STARTING && (to.getX() != from.getX() || to.getZ() != from.getZ())) + event.setTo(from.setDirection(to.getDirection())); + if (player.getLocation().getBlock().isLiquid()) sumoEvent.eliminatePlayer(player); + } + } + + if (player.getLocation().getY() <= 0 && this.plugin.getManagerHandler().getSettingsManager().isVoidSpawn()) { + this.plugin.getManagerHandler().getPlayerManager().teleportSpawn(player); + return; + } + } + + @EventHandler + public void onConsume(PlayerItemConsumeEvent event) { + Player player = event.getPlayer(); + + if (event.getItem().getType() == Material.POTION && this.plugin.getManagerHandler().getSettingsManager().isDeleteBottles()) { + this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, () -> { + player.getInventory().remove(Material.GLASS_BOTTLE); + player.updateInventory(); + }, 1L); + } + } + + @EventHandler + public void onPotionSplash(PotionSplashEvent event) { + if (event.getEntity().getShooter() instanceof Player) { + Player player = (Player) event.getEntity().getShooter(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + for (PotionEffect effect : event.getEntity().getEffects()) { + if (effect.getType().equals(PotionEffectType.HEAL)) { + practiceProfile.setThrownPots(practiceProfile.getThrownPots() + 1); + if (event.getIntensity(player) >= 0.95 && event.getIntensity(player) <= 1) { + practiceProfile.setFullyLandedPots(practiceProfile.getFullyLandedPots() + 1); + } + } + } + event.getAffectedEntities().forEach(e -> { + if (e instanceof Player) { + Player affected = (Player) e; + if (!player.canSee(affected)) event.setIntensity(affected, 0); + } + }); + } + } +} diff --git a/src/main/java/me/abhi/practice/listener/hcf/ArcherListener.java b/src/main/java/me/abhi/practice/listener/hcf/ArcherListener.java new file mode 100644 index 0000000..23e7d09 --- /dev/null +++ b/src/main/java/me/abhi/practice/listener/hcf/ArcherListener.java @@ -0,0 +1,139 @@ +package me.abhi.practice.listener.hcf; + +import lombok.RequiredArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.kit.hcf.data.archer.ArcherData; +import me.abhi.practice.kit.hcf.data.archer.ArcherItem; +import me.abhi.practice.match.Match; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyState; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.concurrent.TimeUnit; + +@SuppressWarnings("Duplicates") +@RequiredArgsConstructor +public class ArcherListener implements Listener { + + private final PracticePlugin plugin; + private ArcherData archerData = new ArcherData(); + + @EventHandler + public void onInteract(PlayerInteractEvent event) { + Player player = event.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.PARTY) { + return; + } + + Party party = practiceProfile.getParty(); + if (party.getPartyState() != PartyState.MATCH) { + return; + } + + Match match = party.getMatch(); + + if (match.getKit() != null || practiceProfile.getHcfKit() != HCFKit.ARCHER) { + return; + } + + if (event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_AIR) { + + ArcherItem archerItem = archerData.getArcherItemList().stream().filter(a -> a.getMaterial() == player.getItemInHand().getType()).findFirst().orElse(null); + + if (archerItem == null) { + return; + } + + if (System.currentTimeMillis() - (archerItem.getActivated().getType() == PotionEffectType.SPEED ? practiceProfile.getLastArcherSpeedBuff() : practiceProfile.getLastArcherJumpBuff()) <= 60000) { + event.setCancelled(true); + + long timeLeft = 60 - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - (archerItem.getActivated().getType() == PotionEffectType.SPEED ? practiceProfile.getLastArcherSpeedBuff() : practiceProfile.getLastArcherJumpBuff())); + + player.sendMessage(Messages.MUST_WAIT_TO_ARCHER_BUFF.getMessage().replace("%time%", String.valueOf(timeLeft))); + return; + } + player.getItemInHand().setAmount(player.getItemInHand().getAmount() - 1); + player.updateInventory(); + + if (archerItem.getActivated().getType() == PotionEffectType.SPEED) { + practiceProfile.setLastArcherSpeedBuff(System.currentTimeMillis()); + } else { + practiceProfile.setLastArcherJumpBuff(System.currentTimeMillis()); + } + + player.removePotionEffect(archerItem.getActivated().getType()); + player.addPotionEffect(archerItem.getActivated()); + + player.sendMessage(Messages.ACTIVATED_ARCHER_BUFF.getMessage().replace("%buff%", archerItem.getName())); + + if (archerItem.getActivated().getType() == PotionEffectType.SPEED) { + this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, () -> { + if (party.getPartyState() != PartyState.MATCH || party.getMatch() != match || !player.isOnline() || practiceProfile.getHcfKit() != HCFKit.ARCHER) { + return; + } + player.removePotionEffect(PotionEffectType.SPEED); + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 2)); + }, 195L); + } + return; + } + } + + @EventHandler + public void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled()) { + return; + } + if (event.getEntity() instanceof Player) { + Player attacked = (Player) event.getEntity(); + PracticeProfile attackedProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(attacked); + + if (System.currentTimeMillis() - attackedProfile.getLastArcherMark() <= 15000) { + event.setDamage(event.getDamage() * 1.3); + } + + if (event.getDamager() instanceof Arrow) { + Arrow arrow = (Arrow) event.getDamager(); + + if (arrow.getShooter() instanceof Player) { + Player damager = (Player) arrow.getShooter(); + PracticeProfile damagerProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(damager); + + if (damagerProfile.getPlayerState() != PlayerState.PARTY) { + return; + } + + Party party = damagerProfile.getParty(); + if (party.getPartyState() != PartyState.MATCH) { + return; + } + + Match match = party.getMatch(); + + if (match.getKit() != null || damagerProfile.getHcfKit() != HCFKit.ARCHER) { + return; + } + if (attackedProfile.getLastArcherMark() == 0) { + attacked.sendMessage(Messages.ARCHER_TAGGED.getMessage()); + damager.sendMessage(Messages.PLAYER_ARCHER_TAGGED.getMessage().replace("%player%", attacked.getName())); + } + attackedProfile.setLastArcherMark(System.currentTimeMillis()); + } + } + } + } +} diff --git a/src/main/java/me/abhi/practice/listener/hcf/BardListener.java b/src/main/java/me/abhi/practice/listener/hcf/BardListener.java new file mode 100644 index 0000000..450c335 --- /dev/null +++ b/src/main/java/me/abhi/practice/listener/hcf/BardListener.java @@ -0,0 +1,163 @@ +package me.abhi.practice.listener.hcf; + +import lombok.RequiredArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.event.impl.BardHoldItemEvent; +import me.abhi.practice.event.impl.BardTaskUpdateEvent; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.kit.hcf.data.bard.BardData; +import me.abhi.practice.kit.hcf.data.bard.BardItem; +import me.abhi.practice.match.Match; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyState; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.concurrent.TimeUnit; + +@SuppressWarnings("Duplicates") +@RequiredArgsConstructor +public class BardListener implements Listener { + + private final PracticePlugin plugin; + private BardData bardData = new BardData(); + + @EventHandler + public void onInteract(PlayerInteractEvent event) { + Player player = event.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.PARTY) { + return; + } + + Party party = practiceProfile.getParty(); + if (party.getPartyState() != PartyState.MATCH) { + return; + } + + Match match = party.getMatch(); + + if (match.getKit() != null || practiceProfile.getHcfKit() != HCFKit.BARD) { + return; + } + + if (event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_AIR) { + + BardItem bardItem = bardData.getBardItemList().stream().filter(b -> b.getMaterial() == player.getItemInHand().getType()).findFirst().orElse(null); + + if (bardItem == null) { + return; + } + + if (practiceProfile.getBardEnergy() < bardItem.getEnergy()) { + event.setCancelled(true); + player.sendMessage(Messages.NEED_MORE_ENERGY.getMessage().replace("%energy%", String.valueOf(bardItem.getEnergy()))); + return; + } + + if (System.currentTimeMillis() - practiceProfile.getLastBardBuff() <= 6000) { + event.setCancelled(true); + + long timeLeft = 6 - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - practiceProfile.getLastBardBuff()); + player.sendMessage(Messages.MUST_WAIT_TO_BARD_BUFF.getMessage().replace("%time%", String.valueOf(timeLeft))); + return; + } + + practiceProfile.setBardEnergy(practiceProfile.getBardEnergy() - bardItem.getEnergy()); + practiceProfile.setLastBardBuff(System.currentTimeMillis()); + + player.sendMessage(Messages.ACTIVATED_BARD_BUFF.getMessage().replace("%buff%", bardItem.getName())); + party.getMembers().stream().filter(u -> !match.getDead().contains(u) && this.plugin.getServer().getPlayer(u).getLocation().distanceSquared(player.getLocation()) <= 400).forEach(u -> { + Player member = this.plugin.getServer().getPlayer(u); + if ((member == player && bardItem.isBard()) || member != player) { + member.removePotionEffect(bardItem.getHeld().getType()); + member.addPotionEffect(bardItem.getActivated()); + } + }); + return; + } + } + + @EventHandler + public void onBardHold(BardHoldItemEvent event) { + Player player = event.getPlayer(); + BardItem bardItem = event.getBardItem(); + + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + Party party = practiceProfile.getParty(); + Match match = party.getMatch(); + + party.getMembers().stream().filter(u -> !match.getDead().contains(u) && this.plugin.getServer().getPlayer(u).getLocation().distanceSquared(player.getLocation()) <= 400).forEach(u -> { + Player member = this.plugin.getServer().getPlayer(u); + PracticeProfile memberProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(member); + + if (this.plugin.getManagerHandler().getPlayerManager().getPotionEffect(member, bardItem.getHeld().getType()) != null) { + PotionEffect potionEffect = this.plugin.getManagerHandler().getPlayerManager().getPotionEffect(member, bardItem.getHeld().getType()); + + if (potionEffect.getDuration() > 140) { + memberProfile.getPotionEffectsList().add(potionEffect); + + if ((member == player && bardItem.isBard() && bardItem.getHeld().getType() != PotionEffectType.DAMAGE_RESISTANCE && bardItem.getHeld().getType() != PotionEffectType.REGENERATION) || (member != player || potionEffect.getAmplifier() <= bardItem.getHeld().getAmplifier())) + member.removePotionEffect(bardItem.getHeld().getType()); + } + + } + if ((member == player && bardItem.isBard() && bardItem.getHeld().getType() != PotionEffectType.DAMAGE_RESISTANCE && bardItem.getHeld().getType() != PotionEffectType.REGENERATION) || member != player) + member.addPotionEffect(bardItem.getHeld()); + }); + } + + @EventHandler + public void onBardTask(BardTaskUpdateEvent event) { + try { + Player player = event.getPlayer(); + + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + Party party = practiceProfile.getParty(); + Match match = party.getMatch(); + + party.getMembers().stream().filter(u -> !match.getDead().contains(u)).forEach(u -> { + Player member = this.plugin.getServer().getPlayer(u); + restoreEffects(member); + }); + } catch (Exception ex) { + // remove random errors :D + } + } + + private void restoreEffects(Player player) { + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + for (PotionEffect potionEffect : practiceProfile.getPotionEffectsList()) { + + if (bardData.getBlockedList().contains(potionEffect.getType())) { + practiceProfile.getPotionEffectsList().remove(potionEffect); + return; + } + + if (!player.hasPotionEffect(potionEffect.getType())) removeType(player, potionEffect.getType()); + player.addPotionEffect(potionEffect); + } + } + + private void removeType(Player player, PotionEffectType potionEffectType) { + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + for (int i = 0; i < practiceProfile.getPotionEffectsList().size(); i++) { + PotionEffect potionEffect = practiceProfile.getPotionEffectsList().get(i); + + if (potionEffect.getType() == potionEffectType && potionEffect.getDuration() <= 100) { + practiceProfile.getPotionEffectsList().remove(potionEffect); + } + } + } +} diff --git a/src/main/java/me/abhi/practice/listener/hcf/RogueListener.java b/src/main/java/me/abhi/practice/listener/hcf/RogueListener.java new file mode 100644 index 0000000..019dc6a --- /dev/null +++ b/src/main/java/me/abhi/practice/listener/hcf/RogueListener.java @@ -0,0 +1,149 @@ +package me.abhi.practice.listener.hcf; + +import lombok.RequiredArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.kit.hcf.data.rogue.RogueData; +import me.abhi.practice.kit.hcf.data.rogue.RogueItem; +import me.abhi.practice.match.Match; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyState; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.concurrent.TimeUnit; + +@SuppressWarnings("Duplicates") +@RequiredArgsConstructor +public class RogueListener implements Listener { + + private final PracticePlugin plugin; + private RogueData rogueData = new RogueData(); + + @EventHandler + public void onInteract(PlayerInteractEvent event) { + Player player = event.getPlayer(); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (practiceProfile.getPlayerState() != PlayerState.PARTY) { + return; + } + + Party party = practiceProfile.getParty(); + if (party.getPartyState() != PartyState.MATCH) { + return; + } + + Match match = party.getMatch(); + + if (match.getKit() != null || practiceProfile.getHcfKit() != HCFKit.ROGUE) { + return; + } + + if (event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_AIR) { + + RogueItem rogueItem = rogueData.getRogueItemList().stream().filter(r -> r.getMaterial() == player.getItemInHand().getType()).findFirst().orElse(null); + + if (rogueItem == null) { + return; + } + + if (System.currentTimeMillis() - (rogueItem.getActivated().getType() == PotionEffectType.SPEED ? practiceProfile.getLastRogueSpeedBuff() : practiceProfile.getLastRogueJumpBuff()) <= 60000) { + event.setCancelled(true); + + long timeLeft = 60 - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - (rogueItem.getActivated().getType() == PotionEffectType.SPEED ? practiceProfile.getLastRogueSpeedBuff() : practiceProfile.getLastRogueJumpBuff())); + + player.sendMessage(Messages.MUST_WAIT_TO_ROGUE_BUFF.getMessage().replace("%time%", String.valueOf(timeLeft))); + return; + } + player.getItemInHand().setAmount(player.getItemInHand().getAmount() - 1); + player.updateInventory(); + + if (rogueItem.getActivated().getType() == PotionEffectType.SPEED) { + practiceProfile.setLastRogueSpeedBuff(System.currentTimeMillis()); + } else { + practiceProfile.setLastRogueJumpBuff(System.currentTimeMillis()); + } + + player.removePotionEffect(rogueItem.getActivated().getType()); + player.addPotionEffect(rogueItem.getActivated()); + + player.sendMessage(Messages.ACTIVATED_ROGUE_BUFF.getMessage().replace("%buff%", rogueItem.getName())); + + this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, () -> { + if (party.getPartyState() != PartyState.MATCH || party.getMatch() != match || !player.isOnline() || practiceProfile.getHcfKit() != HCFKit.ROGUE) { + return; + } + player.removePotionEffect(rogueItem.getActivated().getType()); + player.addPotionEffect(new PotionEffect(rogueItem.getActivated().getType(), Integer.MAX_VALUE, 2)); + }, 195L); + } + return; + } + + @EventHandler + public void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled()) { + return; + } + if (event.getEntity() instanceof Player && event.getDamager() instanceof Player) { + Player attacked = (Player) event.getEntity(); + Player damager = (Player) event.getDamager(); + + PracticeProfile damagerProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(damager); + + if (damagerProfile.getPlayerState() != PlayerState.PARTY) { + return; + } + + Party party = damagerProfile.getParty(); + if (party.getPartyState() != PartyState.MATCH) { + return; + } + + Match match = party.getMatch(); + + if (match.getKit() != null || damagerProfile.getHcfKit() != HCFKit.ROGUE) { + return; + } + + if (damager.getItemInHand().getType() != Material.GOLD_SWORD) { + return; + } + + if (System.currentTimeMillis() - damagerProfile.getLastRogueBackstab() <= 6000) { + long timeLeft = 6 - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - damagerProfile.getLastRogueBackstab()); + damager.sendMessage(Messages.MUST_WAIT_TO_BACKSTAB.getMessage().replace("%time%", String.valueOf(timeLeft))); + return; + } + damager.setItemInHand(new ItemStack(Material.AIR, 1)); + + damager.playSound(damager.getLocation(), Sound.ITEM_BREAK, 1.0F, 1.0F); + attacked.playSound(damager.getLocation(), Sound.ITEM_BREAK, 1.0F, 1.0F); + + attacked.sendMessage(Messages.BACKSTABBED.getMessage().replace("%player%", damager.getName())); + damager.sendMessage(Messages.BACKSTABBED_PLAYER.getMessage().replace("%player%", attacked.getName())); + + event.setDamage(0); + attacked.setHealth(attacked.getHealth() - 5); + damagerProfile.setLastRogueBackstab(System.currentTimeMillis()); + + damager.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 40, 0)); + damager.addPotionEffect(new PotionEffect(PotionEffectType.WITHER, 40, 0)); + return; + } + } +} + diff --git a/src/main/java/me/abhi/practice/manager/Manager.java b/src/main/java/me/abhi/practice/manager/Manager.java new file mode 100644 index 0000000..f8a990a --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/Manager.java @@ -0,0 +1,11 @@ +package me.abhi.practice.manager; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class Manager { + + public ManagerHandler managerHandler; +} diff --git a/src/main/java/me/abhi/practice/manager/ManagerHandler.java b/src/main/java/me/abhi/practice/manager/ManagerHandler.java new file mode 100644 index 0000000..3c444a0 --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/ManagerHandler.java @@ -0,0 +1,41 @@ +package me.abhi.practice.manager; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.manager.impl.*; + +@Getter +@RequiredArgsConstructor +public class ManagerHandler { + + private final PracticePlugin plugin; + + private MongoManager mongoManager; + private SettingsManager settingsManager; + private ConfigurationManager configurationManager; + private ItemsManager itemsManager; + private PlayerManager playerManager; + private ProfileManager profileManager; + private KitManager kitManager; + private MenuManager menuManager; + private ScoreboardManager scoreboardManager; + private ArenaManager arenaManager; + private EventManager eventManager; + private TournamentManager tournamentManager; + + public void register() { + mongoManager = new MongoManager(this); + settingsManager = new SettingsManager(this); + configurationManager = new ConfigurationManager(this); + itemsManager = new ItemsManager(this); + playerManager = new PlayerManager(this); + profileManager = new ProfileManager(this); + kitManager = new KitManager(this); + menuManager = new MenuManager(this); + scoreboardManager = new ScoreboardManager(this); + arenaManager = new ArenaManager(this); + eventManager = new EventManager(this); + tournamentManager = new TournamentManager(this); + } +} diff --git a/src/main/java/me/abhi/practice/manager/impl/ArenaManager.java b/src/main/java/me/abhi/practice/manager/impl/ArenaManager.java new file mode 100644 index 0000000..09ed34b --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/impl/ArenaManager.java @@ -0,0 +1,73 @@ +package me.abhi.practice.manager.impl; + +import me.abhi.practice.arena.Arena; +import me.abhi.practice.kit.Kit; +import me.abhi.practice.kit.KitType; +import me.abhi.practice.manager.Manager; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.util.LocationUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; + +public class ArenaManager extends Manager { + + private List arenasList; + + public ArenaManager(ManagerHandler managerHandler) { + super(managerHandler); + + arenasList = new ArrayList<>(); + fetch(); + } + + private void fetch() { + if (managerHandler.getConfigurationManager().getArenasFile().getConfigurationSection("arenas") == null) { + return; + } + + managerHandler.getConfigurationManager().getArenasFile().getConfigurationSection("arenas").getKeys(false).stream().forEach(a -> { + Arena arena = new Arena(a); + arena.setL1(LocationUtil.getLocationFromString(managerHandler.getConfigurationManager().getArenasFile().getString("arenas." + a + ".l1"))); + arena.setL2(LocationUtil.getLocationFromString(managerHandler.getConfigurationManager().getArenasFile().getString("arenas." + a + ".l2"))); + arena.setKitType(KitType.getType(managerHandler.getConfigurationManager().getArenasFile().getString("arenas." + a + ".type"))); + + addArena(arena); + }); + } + + public Arena getArena(String name) { + return arenasList.stream().filter(a -> a.getName().equalsIgnoreCase(name)).findFirst().orElse(null); + } + + public void addArena(Arena arena) { + arenasList.add(arena); + } + + public void removeArena(Arena arena) { + arenasList.remove(arena); + } + + public Arena randomArena(Kit kit) { + // Cleaned up to Java 8 Standards + List compatible = arenasList.stream().filter(a -> a.getKitType() == kit.getKitType()).collect(Collectors.toList()); + return compatible.get(new Random().nextInt(compatible.size())); + } + + public Arena randomArena(KitType kitType) { + List compatible = arenasList.stream().filter(a -> a.getKitType() == kitType).collect(Collectors.toList()); + return compatible.get(new Random().nextInt(compatible.size())); + } + + public void save() { + managerHandler.getConfigurationManager().getArenasFile().set("arenas", null); + arenasList.stream().forEach(a -> { + if (a.getL1() != null) managerHandler.getConfigurationManager().getArenasFile().set("arenas." + a.getName() + ".l1", LocationUtil.getStringFromLocation(a.getL1())); + if (a.getL2() != null) managerHandler.getConfigurationManager().getArenasFile().set("arenas." + a.getName() + ".l2", LocationUtil.getStringFromLocation(a.getL2())); + managerHandler.getConfigurationManager().getArenasFile().set("arenas." + a.getName() + ".type", a.getKitType().toString()); + }); + managerHandler.getConfigurationManager().saveArenasFile(); + } +} diff --git a/src/main/java/me/abhi/practice/manager/impl/ConfigurationManager.java b/src/main/java/me/abhi/practice/manager/impl/ConfigurationManager.java new file mode 100644 index 0000000..9bc2356 --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/impl/ConfigurationManager.java @@ -0,0 +1,98 @@ +package me.abhi.practice.manager.impl; + +import lombok.Getter; +import me.abhi.practice.manager.Manager; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.Logger; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.util.Arrays; + +@Getter +public class ConfigurationManager extends Manager { + + private YamlConfiguration messagesFile; + private YamlConfiguration kitsFile; + private YamlConfiguration arenasFile; + private YamlConfiguration eventsFile; + + public ConfigurationManager(ManagerHandler managerHandler) { + super(managerHandler); + + createFiles(); + } + + private void createFiles() { + try { + File mFile = new File(managerHandler.getPlugin().getDataFolder(), "messages.yml"); + if (!mFile.exists()) { + mFile.createNewFile(); + Logger.success("Created messages.yml"); + } + messagesFile = YamlConfiguration.loadConfiguration(mFile); + Arrays.stream(Messages.values()).filter(messages -> messagesFile.get(messages.getPath()) == null).forEach(messages -> messagesFile.set(messages.getPath(), messages.getDefaultMessage())); + saveMessagesFile(); + + File kFile = new File(managerHandler.getPlugin().getDataFolder(), "kits.yml"); + if (!kFile.exists()) { + kFile.createNewFile(); + Logger.success("Created kits.yml"); + } + kitsFile = YamlConfiguration.loadConfiguration(kFile); + + File aFile = new File(managerHandler.getPlugin().getDataFolder(), "arenas.yml"); + if (!aFile.exists()) { + aFile.createNewFile(); + Logger.success("Created arenas.yml"); + } + arenasFile = YamlConfiguration.loadConfiguration(aFile); + + File eFile = new File(managerHandler.getPlugin().getDataFolder(), "events.yml"); + if (!eFile.exists()) { + eFile.createNewFile(); + Logger.success("Created events.yml"); + } + eventsFile = YamlConfiguration.loadConfiguration(eFile); + } catch (Exception ex) { + Logger.error("Error loading files."); + } + } + + public void saveMessagesFile() { + try { + File mFile = new File(managerHandler.getPlugin().getDataFolder(), "messages.yml"); + messagesFile.save(mFile); + } catch (Exception ex) { + Logger.error("Could not save messages.yml"); + } + } + + public void saveKitsFile() { + try { + File kFile = new File(managerHandler.getPlugin().getDataFolder(), "kits.yml"); + kitsFile.save(kFile); + } catch (Exception ex) { + Logger.error("Could not save kits.yml"); + } + } + + public void saveArenasFile() { + try { + File aFile = new File(managerHandler.getPlugin().getDataFolder(), "arenas.yml"); + arenasFile.save(aFile); + } catch (Exception ex) { + Logger.error("Could not save arenas.yml"); + } + } + + public void saveEventsFile() { + try { + File eFile = new File(managerHandler.getPlugin().getDataFolder(), "events.yml"); + eventsFile.save(eFile); + } catch (Exception ex) { + Logger.error("Could not save event.yml"); + } + } +} diff --git a/src/main/java/me/abhi/practice/manager/impl/EventManager.java b/src/main/java/me/abhi/practice/manager/impl/EventManager.java new file mode 100644 index 0000000..2f9393f --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/impl/EventManager.java @@ -0,0 +1,82 @@ +package me.abhi.practice.manager.impl; + +import lombok.Getter; +import lombok.Setter; +import me.abhi.practice.hostedevent.HostedEvent; +import me.abhi.practice.hostedevent.impl.SumoEvent; +import me.abhi.practice.manager.Manager; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.util.LocationUtil; + +import java.util.ArrayList; +import java.util.List; + +@Setter +@Getter +public class EventManager extends Manager { + + private List currentEvents; + private long lastEvent; + + private List eventList; + + public EventManager(ManagerHandler managerHandler) { + super(managerHandler); + + currentEvents = new ArrayList<>(); + eventList = new ArrayList<>(); + loadEvents(); + fetch(); + } + + private void loadEvents() { + addEvent(new SumoEvent()); + } + + private void fetch() { + eventList.forEach(e -> { + if (this.managerHandler.getConfigurationManager().getEventsFile().get(e.getName()) != null) { + + if (managerHandler.getConfigurationManager().getEventsFile().get(e.getName() + ".lobby") != null) + e.setLobby(LocationUtil.getLocationFromString(managerHandler.getConfigurationManager().getEventsFile().getString(e.getName() + ".lobby"))); + + if (managerHandler.getConfigurationManager().getEventsFile().get(e.getName() + ".first") != null) + e.setFirst(LocationUtil.getLocationFromString(managerHandler.getConfigurationManager().getEventsFile().getString(e.getName() + ".first"))); + + + if (managerHandler.getConfigurationManager().getEventsFile().get(e.getName() + ".second") != null) + e.setSecond(LocationUtil.getLocationFromString(managerHandler.getConfigurationManager().getEventsFile().getString(e.getName() + ".second"))); + } + }); + } + + private void addEvent(HostedEvent event) { + eventList.add(event); + } + + public HostedEvent getEvent(String name) { + return eventList.stream().filter(e -> e.getName().equalsIgnoreCase(name)).findFirst().orElse(null); + } + + public HostedEvent getStartedEvent(String name) { + return currentEvents.stream().filter(e -> e.getName().equalsIgnoreCase(name)).findFirst().orElse(null); + } + + public void save() { + eventList.forEach(e -> { + this.managerHandler.getConfigurationManager().getEventsFile().set(e.getName(), null); + + if (e.getLobby() != null) + this.managerHandler.getConfigurationManager().getEventsFile().set(e.getName() + ".lobby", LocationUtil.getStringFromLocation(e.getLobby())); + + if (e.getFirst() != null) + this.managerHandler.getConfigurationManager().getEventsFile().set(e.getName() + ".first", LocationUtil.getStringFromLocation(e.getFirst())); + + + if (e.getSecond() != null) + this.managerHandler.getConfigurationManager().getEventsFile().set(e.getName() + ".second", LocationUtil.getStringFromLocation(e.getSecond())); + + }); + this.managerHandler.getConfigurationManager().saveEventsFile(); + } +} diff --git a/src/main/java/me/abhi/practice/manager/impl/ItemsManager.java b/src/main/java/me/abhi/practice/manager/impl/ItemsManager.java new file mode 100644 index 0000000..fc9d06d --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/impl/ItemsManager.java @@ -0,0 +1,36 @@ +package me.abhi.practice.manager.impl; + +import me.abhi.practice.manager.Manager; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.util.enums.Items; +import me.abhi.practice.util.misc.CC; +import me.abhi.practice.util.misc.ItemBuilder; +import org.bukkit.Material; + +import java.util.Arrays; +import java.util.List; + +public class ItemsManager extends Manager { + + public ItemsManager(ManagerHandler managerHandler) { + super(managerHandler); + + fetch(); + } + + private void fetch() { + Arrays.stream(Items.values()).forEach(item -> { + String[] material = managerHandler.getPlugin().getConfig().getString("items." + item.toString() + ".id").split(":"); + String name = CC.translate(managerHandler.getPlugin().getConfig().getString("items." + item.toString() + ".name")); + int slot = managerHandler.getPlugin().getConfig().getInt("items." + item.toString() + ".slot"); + boolean loreEnabled = managerHandler.getPlugin().getConfig().getBoolean("items." + item.toString() + ".lore-enabled"); + List lore = managerHandler.getPlugin().getConfig().getStringList("items." + item.toString() + ".lore"); + + int id = Integer.parseInt(material[0]); + short durability = (short) Integer.parseInt(material[1]); + + item.setItem(new ItemBuilder(Material.getMaterial(id)).setDurability(durability).setName(name).setLore(loreEnabled ? lore : null).toItemStack()); + item.setSlot(slot); + }); + } +} diff --git a/src/main/java/me/abhi/practice/manager/impl/KitManager.java b/src/main/java/me/abhi/practice/manager/impl/KitManager.java new file mode 100644 index 0000000..0e5073f --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/impl/KitManager.java @@ -0,0 +1,118 @@ +package me.abhi.practice.manager.impl; + +import lombok.Getter; +import me.abhi.practice.kit.Kit; +import me.abhi.practice.kit.KitType; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.manager.Manager; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.util.InventoryUtil; +import me.abhi.practice.util.misc.ItemBuilder; +import me.abhi.practice.util.misc.Logger; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Getter +public class KitManager extends Manager { + + private List kitsList; + + public KitManager(ManagerHandler managerHandler) { + super(managerHandler); + + kitsList = new ArrayList<>(); + fetch(); + } + + private void fetch() { + if (managerHandler.getConfigurationManager().getKitsFile().getConfigurationSection("kits") == null) { + return; + } + + managerHandler.getConfigurationManager().getKitsFile().getConfigurationSection("kits").getKeys(false).stream().forEach(k -> { + Kit kit = new Kit(k); + + String[] material = managerHandler.getConfigurationManager().getKitsFile().getString("kits." + k + ".display").split(":"); + + int id = Integer.parseInt(material[0]); + short durability = (short) Integer.parseInt(material[1]); + + kit.setDisplay(new ItemBuilder(Material.getMaterial(id)).setDurability(durability).toItemStack()); + + if (managerHandler.getConfigurationManager().getKitsFile().get("kits." + k + ".inventory") != null) + kit.setInventory(InventoryUtil.fromBase64(managerHandler.getConfigurationManager().getKitsFile().getString("kits." + k + ".inventory"))); + if (managerHandler.getConfigurationManager().getKitsFile().get("kits." + k + ".armor") != null) + kit.setArmor(InventoryUtil.itemStackArrayFromBase64(managerHandler.getConfigurationManager().getKitsFile().getString("kits." + k + ".armor"))); + if (managerHandler.getConfigurationManager().getKitsFile().get("kits." + k + ".editInventory") != null) + kit.setEditInventory(InventoryUtil.fromBase64(managerHandler.getConfigurationManager().getKitsFile().getString("kits." + k + ".editInventory"))); + + kit.setKitType(KitType.getType(managerHandler.getConfigurationManager().getKitsFile().getString("kits." + k + ".type"))); + kit.setEditChest(managerHandler.getConfigurationManager().getKitsFile().getBoolean("kits." + k + ".editChest")); + kit.setRanked(managerHandler.getConfigurationManager().getKitsFile().getBoolean("kits." + k + ".ranked")); + kit.setUnranked(managerHandler.getConfigurationManager().getKitsFile().getBoolean("kits." + k + ".unranked")); + kit.setEditable(managerHandler.getConfigurationManager().getKitsFile().getBoolean("kits." + k + ".editable")); + + addKit(kit); + + if (!this.managerHandler.getMongoManager().collectionExists(k)) { + this.managerHandler.getMongoManager().getMongoDatabase().createCollection(k); + + Logger.success("Created Mongo collection " + k + "."); + } + }); + if (managerHandler.getConfigurationManager().getKitsFile().getConfigurationSection("hcf") == null) { + return; + } + + managerHandler.getConfigurationManager().getKitsFile().getConfigurationSection("hcf").getKeys(false).stream().forEach(k -> { + HCFKit hcfKit = HCFKit.valueOf(k); + + if (managerHandler.getConfigurationManager().getKitsFile().get("hcf." + k + ".inventory") != null) hcfKit.setInventory(InventoryUtil.fromBase64(managerHandler.getConfigurationManager().getKitsFile().getString("hcf." + k + ".inventory"))); + if (managerHandler.getConfigurationManager().getKitsFile().get("hcf." + k + ".armor") != null) hcfKit.setArmor(InventoryUtil.itemStackArrayFromBase64(managerHandler.getConfigurationManager().getKitsFile().getString("hcf." + k + ".armor"))); + }); + + } + + public Kit getKit(String name) { + return kitsList.stream().filter(k -> k.getName().equalsIgnoreCase(name)).findFirst().orElse(null); + } + + public void addKit(Kit kit) { + kitsList.add(kit); + } + + public void removeKit(Kit kit) { + kitsList.remove(kit); + } + + public void save() { + managerHandler.getConfigurationManager().getKitsFile().set("kits", null); + kitsList.forEach(k -> { + managerHandler.getConfigurationManager().getKitsFile().set("kits." + k.getName() + ".display", k.getDisplay().getTypeId() + ":" + k.getDisplay().getDurability()); + if (k.getInventory() != null) + managerHandler.getConfigurationManager().getKitsFile().set("kits." + k.getName() + ".inventory", InventoryUtil.toBase64(k.getInventory())); + if (k.getArmor() != null) + managerHandler.getConfigurationManager().getKitsFile().set("kits." + k.getName() + ".armor", InventoryUtil.itemStackArrayToBase64(k.getArmor())); + if (k.getEditInventory() != null) + managerHandler.getConfigurationManager().getKitsFile().set("kits." + k.getName() + ".editInventory", InventoryUtil.toBase64(k.getEditInventory())); + managerHandler.getConfigurationManager().getKitsFile().set("kits." + k.getName() + ".type", k.getKitType().toString()); + managerHandler.getConfigurationManager().getKitsFile().set("kits." + k.getName() + ".editChest", k.isEditChest()); + managerHandler.getConfigurationManager().getKitsFile().set("kits." + k.getName() + ".ranked", k.isRanked()); + managerHandler.getConfigurationManager().getKitsFile().set("kits." + k.getName() + ".unranked", k.isUnranked()); + managerHandler.getConfigurationManager().getKitsFile().set("kits." + k.getName() + ".editable", k.isEditable()); + + }); + managerHandler.getConfigurationManager().getKitsFile().set("hcf", null); + Arrays.stream(HCFKit.values()).forEach(k -> { + if (k.getInventory() != null) + managerHandler.getConfigurationManager().getKitsFile().set("hcf." + k.toString() + ".inventory", InventoryUtil.toBase64(k.getInventory())); + if (k.getArmor() != null) + managerHandler.getConfigurationManager().getKitsFile().set("hcf." + k.toString() + ".armor", InventoryUtil.itemStackArrayToBase64(k.getArmor())); + }); + managerHandler.getConfigurationManager().saveKitsFile(); + } + +} diff --git a/src/main/java/me/abhi/practice/manager/impl/MenuManager.java b/src/main/java/me/abhi/practice/manager/impl/MenuManager.java new file mode 100644 index 0000000..164d5f8 --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/impl/MenuManager.java @@ -0,0 +1,52 @@ +package me.abhi.practice.manager.impl; + +import me.abhi.practice.manager.Manager; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.util.enums.Menus; +import me.abhi.practice.util.misc.CC; +import me.abhi.practice.util.misc.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.inventory.Inventory; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class MenuManager extends Manager { + + public MenuManager(ManagerHandler managerHandler) { + super(managerHandler); + + fetch(); + } + + private void fetch() { + Arrays.stream(Menus.values()).forEach(m -> { + String name = CC.translate(managerHandler.getPlugin().getConfig().getString("menus." + m.toString() + ".name")); + int slots = 9 * managerHandler.getPlugin().getConfig().getInt("menus." + m.toString() + ".rows"); + String prefix = managerHandler.getPlugin().getConfig().getString("menus." + m.toString() + ".item-prefix"); + String itemPrefix = CC.translate(prefix == null ? "" : prefix); + List lore = managerHandler.getPlugin().getConfig().getStringList("menus." + m.toString() + ".item-lore"); + Inventory inventory = managerHandler.getPlugin().getServer().createInventory(null, slots, name); + + m.setInventory(inventory); + + if (lore != null) m.setItemLore(lore); + + if (m == Menus.SETTINGS) { + if (!managerHandler.getPlugin().getConfig().getBoolean("settings.settings-gui")) return; + + List stringList = new ArrayList<>(); + stringList.addAll(managerHandler.getPlugin().getConfig().getConfigurationSection("menus.SETTINGS.items").getKeys(false)); + + stringList.forEach(s -> { + Menus.SETTINGS.getInventory().addItem( + new ItemBuilder(Material.getMaterial(managerHandler.getPlugin().getConfig().getInt("menus.SETTINGS.items." + s + ".id"))) + .setName(CC.translate(managerHandler.getPlugin().getConfig().getString("menus.SETTINGS.items." + s + ".name"))) + .toItemStack()); + }); + } + m.setItemPrefix(itemPrefix); + }); + } +} diff --git a/src/main/java/me/abhi/practice/manager/impl/MongoManager.java b/src/main/java/me/abhi/practice/manager/impl/MongoManager.java new file mode 100644 index 0000000..ca00cf0 --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/impl/MongoManager.java @@ -0,0 +1,56 @@ +package me.abhi.practice.manager.impl; + +import com.mongodb.MongoClient; +import com.mongodb.MongoCredential; +import com.mongodb.ServerAddress; +import com.mongodb.client.MongoDatabase; +import lombok.Getter; +import me.abhi.practice.manager.Manager; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.util.misc.Logger; + +import java.util.Collections; + +@Getter +public class MongoManager extends Manager { + + private MongoClient mongoClient; + private MongoDatabase mongoDatabase; + + public MongoManager(ManagerHandler managerHandler) { + super(managerHandler); + + establishConnection(); + } + + private void establishConnection() { + String ip = managerHandler.getPlugin().getConfig().getString("mongo.ip"); + int port = managerHandler.getPlugin().getConfig().getInt("mongo.port"); + String database = managerHandler.getPlugin().getConfig().getString("mongo.database"); + boolean usePassword = managerHandler.getPlugin().getConfig().getBoolean("mongo.use-password"); + String username = managerHandler.getPlugin().getConfig().getString("mongo.username"); + String password = managerHandler.getPlugin().getConfig().getString("mongo.password"); + + try { + if (usePassword) { + mongoClient = new MongoClient(new ServerAddress(ip, port), Collections.singletonList(MongoCredential.createCredential(username, database, password.toCharArray()))); + } else { + mongoClient = new MongoClient(new ServerAddress(ip, port)); + } + mongoDatabase = mongoClient.getDatabase(database); + + mongoClient.getAddress(); + Logger.success("Successfully established Mongo connection."); + } catch (Exception ex) { + Logger.error("Could not establish Mongo connection."); + } + } + + public boolean collectionExists(String collection) { + boolean exists = false; + for (String collections : mongoDatabase.listCollectionNames()) { + if (collection.equalsIgnoreCase(collections)) exists = true; + } + return exists; + } +} diff --git a/src/main/java/me/abhi/practice/manager/impl/PlayerManager.java b/src/main/java/me/abhi/practice/manager/impl/PlayerManager.java new file mode 100644 index 0000000..6118615 --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/impl/PlayerManager.java @@ -0,0 +1,305 @@ +package me.abhi.practice.manager.impl; + +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.Filters; +import me.abhi.practice.kit.CustomKit; +import me.abhi.practice.kit.Kit; +import me.abhi.practice.manager.Manager; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.party.Party; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.InventoryUtil; +import me.abhi.practice.util.enums.Items; +import me.abhi.practice.util.misc.CC; +import me.abhi.practice.util.misc.ItemBuilder; +import org.bson.Document; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.HashMap; +import java.util.Map; + +public class PlayerManager extends Manager { + + public PlayerManager(ManagerHandler managerHandler) { + super(managerHandler); + } + + public void resetPlayer(Player player) { + if (player == null || !player.isOnline()) return; + + PracticeProfile practiceProfile = this.managerHandler.getProfileManager().getProfile(player); + + player.getInventory().clear(); + player.getInventory().setArmorContents(null); + player.updateInventory(); + + player.getActivePotionEffects().clear(); + player.setHealth(20); + player.setFoodLevel(20); + player.setExhaustion(0); + player.setSaturation(5); + player.setLevel(0); + player.setExp(0f); + player.setFireTicks(0); + practiceProfile.setLastEnderpearl(0); + practiceProfile.setBardEnergy(0); + practiceProfile.setLastBardBuff(0); + practiceProfile.setLastArcherSpeedBuff(0); + practiceProfile.setLastArcherJumpBuff(0); + practiceProfile.setLastRogueBackstab(0); + practiceProfile.setLastRogueSpeedBuff(0); + practiceProfile.setLastRogueJumpBuff(0); + practiceProfile.getPotionEffectsList().clear(); + + player.getActivePotionEffects().forEach(p -> player.removePotionEffect(p.getType())); + } + + public void giveItems(Player player, boolean hide) { + if (player == null || !player.isOnline()) return; + + resetPlayer(player); + + PracticeProfile practiceProfile = this.managerHandler.getProfileManager().getProfile(player); + + switch (practiceProfile.getPlayerState()) { + case LOBBY: { + player.getInventory().setItem(Items.UNRANKED.getSlot(), Items.UNRANKED.getItem()); + player.getInventory().setItem(Items.RANKED.getSlot(), Items.RANKED.getItem()); + player.getInventory().setItem(Items.PARTY.getSlot(), Items.PARTY.getItem()); + player.getInventory().setItem(Items.EDITKIT.getSlot(), Items.EDITKIT.getItem()); + break; + } + case QUEUE: { + player.getInventory().setItem(Items.LEAVE_QUEUE.getSlot(), Items.LEAVE_QUEUE.getItem()); + break; + } + case PARTY: { + Party party = practiceProfile.getParty(); + + if (party.getLeader() == player.getUniqueId()) { + player.getInventory().setItem(Items.PARTY_EVENTS.getSlot(), Items.PARTY_EVENTS.getItem()); + player.getInventory().setItem(Items.HCF_SELECTOR.getSlot(), Items.HCF_SELECTOR.getItem()); + player.getInventory().setItem(Items.LEADER_PARTY_INFO.getSlot(), Items.LEADER_PARTY_INFO.getItem()); + player.getInventory().setItem(Items.DISBAND_PARTY.getSlot(), Items.DISBAND_PARTY.getItem()); + } else { + player.getInventory().setItem(Items.PLAYER_PARTY_INFO.getSlot(), Items.PLAYER_PARTY_INFO.getItem()); + player.getInventory().setItem(Items.LEAVE_PARTY.getSlot(), Items.LEAVE_PARTY.getItem()); + } + break; + } + case EVENT: { + player.getInventory().setItem(Items.LEAVE_EVENT.getSlot(), Items.LEAVE_EVENT.getItem()); + break; + } + case TOURNAMENT: { + player.getInventory().setItem(Items.LEAVE_TOURNAMENT.getSlot(), Items.LEAVE_TOURNAMENT.getItem()); + break; + } + case SPECTATING: { + player.getInventory().setItem(Items.STOP_SPECTATING.getSlot(), Items.STOP_SPECTATING.getItem()); + break; + } + case SPECTATING_EVENT: { + player.getInventory().setItem(Items.LEAVE_EVENT.getSlot(), Items.LEAVE_EVENT.getItem()); + break; + } + } + player.updateInventory(); + player.setGameMode(GameMode.SURVIVAL); + + if (hide) { + if (!this.managerHandler.getSettingsManager().isShowPlayers()) { + hideAll(player); + hideAll1(player); + } else { + showAll(player); + } + } + } + + public void teleportSpawn(Player player) { + if (managerHandler.getSettingsManager().getSpawn() != null) + player.teleport(managerHandler.getSettingsManager().getSpawn()); + } + + public void save(Player player) { + PracticeProfile practiceProfile = this.managerHandler.getProfileManager().getProfile(player); + + this.managerHandler.getKitManager().getKitsList().forEach(kit -> { + if (managerHandler.getMongoManager().collectionExists(kit.getName())) { + MongoCollection mongoCollection = managerHandler.getMongoManager().getMongoDatabase().getCollection(kit.getName()); + + Map documentMap = new HashMap<>(); + documentMap.put("uuid", player.getUniqueId().toString()); + documentMap.put("username", player.getName()); + documentMap.put("elo", practiceProfile.getElo(kit)); + + for (int i = 1; i <= 7; i++) { + CustomKit customKit = practiceProfile.getCustomKit(kit, i); + + if (customKit != null) { + documentMap.put("kit-" + i + "-name", customKit.getName()); + documentMap.put("kit-" + i + "-inventory", InventoryUtil.toBase64(customKit.getInventory())); + documentMap.put("kit-" + i + "-armor", InventoryUtil.itemStackArrayToBase64(customKit.getArmor())); + } + } + + Document document = (Document) mongoCollection.find(Filters.eq("uuid", player.getUniqueId().toString())).first(); + + if (document != null) mongoCollection.deleteOne(document); + + mongoCollection.insertOne(new Document(documentMap)); + } + }); + } + + public void openEditLayoutInventory(Player player) { + Inventory inventory = this.managerHandler.getPlugin().getServer().createInventory(null, 36, CC.translate(this.managerHandler.getPlugin().getConfig().getString("menus.EDITLAYOUT.name"))); + + PracticeProfile practiceProfile = this.managerHandler.getProfileManager().getProfile(player); + practiceProfile.setEditLayoutInventory(inventory); + + player.openInventory(inventory); + } + + public void updateEditLayout(Player player, Kit kit) { + Map itemMap = new HashMap<>(); + + PracticeProfile practiceProfile = this.managerHandler.getProfileManager().getProfile(player); + + Inventory inventory = practiceProfile.getEditLayoutInventory(); + + this.managerHandler.getPlugin().getConfig().getConfigurationSection("menus.EDITLAYOUT.items").getKeys(false).stream().forEach(i -> { + String[] material = managerHandler.getPlugin().getConfig().getString("menus.EDITLAYOUT.items." + i + ".id").split(":"); + String name = CC.translate(managerHandler.getPlugin().getConfig().getString("menus.EDITLAYOUT.items." + i + ".name")); + + itemMap.put(i, new ItemBuilder(Material.getMaterial(Integer.parseInt(material[0]))).setDurability((short) Integer.parseInt(material[1])).setName(name).toItemStack()); + }); + + for (int i = 1; i <= 7; i++) { + String saveKitName = itemMap.get("save-kit").clone().getItemMeta().getDisplayName().replace("%kit%", kit.getName()).replace("%number%", String.valueOf(i)); + ItemStack saveKit = new ItemBuilder(itemMap.get("save-kit").clone()).setName(saveKitName).toItemStack(); + inventory.setItem(i, saveKit); + + String loadKitName = itemMap.get("load-kit").clone().getItemMeta().getDisplayName().replace("%kit%", kit.getName()).replace("%number%", String.valueOf(i)); + ItemStack loadKit = new ItemBuilder(itemMap.get("load-kit").clone()).setName(loadKitName).toItemStack(); + + String renameKitName = itemMap.get("rename-kit").clone().getItemMeta().getDisplayName().replace("%kit%", kit.getName()).replace("%number%", String.valueOf(i)); + ItemStack renameKit = new ItemBuilder(itemMap.get("rename-kit").clone()).setName(renameKitName).toItemStack(); + + String removeKitName = itemMap.get("remove-kit").clone().getItemMeta().getDisplayName().replace("%kit%", kit.getName()).replace("%number%", String.valueOf(i)); + ItemStack removeKit = new ItemBuilder(itemMap.get("remove-kit").clone()).setName(removeKitName).toItemStack(); + + if (practiceProfile.getCustomKit(kit, i) != null) { + inventory.setItem(i + 9, loadKit); + inventory.setItem(i + 18, renameKit); + inventory.setItem(i + 27, removeKit); + } else { + inventory.setItem(i + 9, new ItemStack(Material.AIR)); + inventory.setItem(i + 18, new ItemStack(Material.AIR)); + inventory.setItem(i + 27, new ItemStack(Material.AIR)); + } + } + } + + public void openPartyEvents(Player player) { + Inventory inventory = this.managerHandler.getPlugin().getServer().createInventory(null, 9 * this.managerHandler.getPlugin().getConfig().getInt("menus.PARTYEVENTS.rows"), CC.translate(this.managerHandler.getPlugin().getConfig().getString("menus.PARTYEVENTS.name"))); + + Map itemMap = new HashMap<>(); + this.managerHandler.getPlugin().getConfig().getConfigurationSection("menus.PARTYEVENTS.items").getKeys(false).stream().forEach(i -> { + String[] material = managerHandler.getPlugin().getConfig().getString("menus.PARTYEVENTS.items." + i + ".id").split(":"); + String name = CC.translate(managerHandler.getPlugin().getConfig().getString("menus.PARTYEVENTS.items." + i + ".name")); + + itemMap.put(i, new ItemBuilder(Material.getMaterial(Integer.parseInt(material[0]))).setDurability((short) Integer.parseInt(material[1])).setName(name).toItemStack()); + }); + + inventory.setItem(this.managerHandler.getPlugin().getConfig().getInt("menus.PARTYEVENTS.items.ffa.slot"), itemMap.get("ffa")); + inventory.setItem(this.managerHandler.getPlugin().getConfig().getInt("menus.PARTYEVENTS.items.split.slot"), itemMap.get("split")); + + player.openInventory(inventory); + } + + public void openPartyDuel(Player player) { + Inventory inventory = this.managerHandler.getPlugin().getServer().createInventory(null, 9 * this.managerHandler.getPlugin().getConfig().getInt("menus.PARTYDUEL.rows"), CC.translate(this.managerHandler.getPlugin().getConfig().getString("menus.PARTYDUEL.name"))); + + Map itemMap = new HashMap<>(); + this.managerHandler.getPlugin().getConfig().getConfigurationSection("menus.PARTYDUEL.items").getKeys(false).stream().forEach(i -> { + String[] material = managerHandler.getPlugin().getConfig().getString("menus.PARTYDUEL.items." + i + ".id").split(":"); + String name = CC.translate(managerHandler.getPlugin().getConfig().getString("menus.PARTYDUEL.items." + i + ".name")); + + itemMap.put(i, new ItemBuilder(Material.getMaterial(Integer.parseInt(material[0]))).setDurability((short) Integer.parseInt(material[1])).setName(name).toItemStack()); + }); + + inventory.setItem(this.managerHandler.getPlugin().getConfig().getInt("menus.PARTYDUEL.items.regular.slot"), itemMap.get("regular")); + inventory.setItem(this.managerHandler.getPlugin().getConfig().getInt("menus.PARTYDUEL.items.hcf.slot"), itemMap.get("hcf")); + + player.openInventory(inventory); + } + + public void openHCFSelector(Player player) { + Inventory inventory = this.managerHandler.getPlugin().getServer().createInventory(null, 9 * this.managerHandler.getPlugin().getConfig().getInt("menus.HCFKITS.rows"), CC.translate(this.managerHandler.getPlugin().getConfig().getString("menus.HCFKITS.name"))); + + PracticeProfile practiceProfile = this.managerHandler.getProfileManager().getProfile(player); + practiceProfile.setHcfKitSelectorInventory(inventory); + + player.openInventory(inventory); + } + + public void updateHCFInventory(Player player) { + PracticeProfile practiceProfile = this.managerHandler.getProfileManager().getProfile(player); + + Inventory inventory = practiceProfile.getHcfKitSelectorInventory(); + inventory.clear(); + + Map itemMap = new HashMap<>(); + this.managerHandler.getPlugin().getConfig().getConfigurationSection("menus.HCFKITS.items").getKeys(false).stream().forEach(i -> { + String[] material = managerHandler.getPlugin().getConfig().getString("menus.HCFKITS.items." + i + ".id").split(":"); + String name = CC.translate(managerHandler.getPlugin().getConfig().getString("menus.HCFKITS.items." + i + ".name")); + + itemMap.put(i, new ItemBuilder(Material.getMaterial(Integer.parseInt(material[0]))).setDurability((short) Integer.parseInt(material[1])).setName(name).toItemStack()); + }); + + Party party = practiceProfile.getParty(); + + party.getMembers().stream().forEach(u -> { + Player member = this.managerHandler.getPlugin().getServer().getPlayer(u); + PracticeProfile memberProfile = this.managerHandler.getProfileManager().getProfile(member); + + ItemStack clone = itemMap.get("player").clone(); + inventory.addItem(new ItemBuilder(clone.getType()).setDurability(clone.getDurability()).setName(clone.getItemMeta().getDisplayName().replace("%player%", member.getName()).replace("%kit%", memberProfile.getHcfKit().getName())).toItemStack()); + }); + } + + public PotionEffect getPotionEffect(Player player, PotionEffectType potionEffectType) { + for (PotionEffect potionEffect : player.getActivePotionEffects()) { + if (potionEffect.getType().equals(potionEffectType)) { + return potionEffect; + } + } + return null; + } + + public void hideAll(Player player) { + this.managerHandler.getPlugin().getServer().getOnlinePlayers().stream().forEach(p -> { + player.hidePlayer(p); + }); + } + + public void hideAll1(Player player) { + this.managerHandler.getPlugin().getServer().getOnlinePlayers().stream().forEach(p -> { + p.hidePlayer(player); + }); + } + + public void showAll(Player player) { + this.managerHandler.getPlugin().getServer().getOnlinePlayers().stream().forEach(p -> { + player.showPlayer(p); + }); + } +} diff --git a/src/main/java/me/abhi/practice/manager/impl/ProfileManager.java b/src/main/java/me/abhi/practice/manager/impl/ProfileManager.java new file mode 100644 index 0000000..5b39f0a --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/impl/ProfileManager.java @@ -0,0 +1,36 @@ +package me.abhi.practice.manager.impl; + +import me.abhi.practice.manager.Manager; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.player.PracticeProfile; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class ProfileManager extends Manager { + + private Map practiceProfileMap; + + public ProfileManager(ManagerHandler managerHandler) { + super(managerHandler); + practiceProfileMap = new HashMap<>(); + } + + public void addPlayer(Player player) { + practiceProfileMap.put(player.getUniqueId(), new PracticeProfile()); + } + + public void removePlayer(Player player) { + practiceProfileMap.remove(player.getUniqueId()); + } + + public PracticeProfile getProfile(Player player) { + return practiceProfileMap.get(player.getUniqueId()); + } + + public boolean hasProfile(Player player) { + return practiceProfileMap.containsKey(player.getUniqueId()); + } +} diff --git a/src/main/java/me/abhi/practice/manager/impl/ScoreboardManager.java b/src/main/java/me/abhi/practice/manager/impl/ScoreboardManager.java new file mode 100644 index 0000000..0af3aa1 --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/impl/ScoreboardManager.java @@ -0,0 +1,228 @@ +package me.abhi.practice.manager.impl; + +import me.abhi.practice.hostedevent.HostedEvent; +import me.abhi.practice.kit.Kit; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.manager.Manager; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.match.Match; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.queue.Queue; +import me.abhi.practice.tournament.Tournament; +import me.abhi.practice.util.DurationUtil; +import me.abhi.practice.util.misc.ScoreHelper; +import me.abhi.practice.util.reflection.BukkitReflection; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +@SuppressWarnings("Duplicates") +public class ScoreboardManager extends Manager { + + public ScoreboardManager(ManagerHandler managerHandler) { + super(managerHandler); + } + + public void update(Player player) { + try { + if (!managerHandler.getProfileManager().hasProfile(player) || !ScoreHelper.hasScore(player) || !this.managerHandler.getPlugin().getConfig().getBoolean("scoreboard.enabled")) { + return; + } + PracticeProfile practiceProfile = this.managerHandler.getProfileManager().getProfile(player); + ScoreHelper scoreHelper = ScoreHelper.getByPlayer(player); + + String title = "Title"; + List toReturn = new ArrayList<>(); + + switch (practiceProfile.getPlayerState()) { + case LOBBY: { + title = managerHandler.getPlugin().getConfig().getString("scoreboard.LOBBY.title"); + for (String line : managerHandler.getPlugin().getConfig().getStringList("scoreboard.LOBBY.slots")) { + line = line.replace("%online%", String.valueOf(this.managerHandler.getPlugin().getServer().getOnlinePlayers().size())); + line = line.replace("%queueing%", String.valueOf(getQueueing())); + line = line.replace("%fighting%", String.valueOf(getFighting())); + toReturn.add(line); + } + break; + } + case QUEUE: { + Queue queue = practiceProfile.getQueue(); + title = managerHandler.getPlugin().getConfig().getString("scoreboard." + (queue.isRanked() ? "RANKED" : "UNRANKED") + "-QUEUE.title"); + for (String line : managerHandler.getPlugin().getConfig().getStringList("scoreboard." + (queue.isRanked() ? "RANKED" : "UNRANKED") + "-QUEUE.slots")) { + line = line.replace("%online%", String.valueOf(this.managerHandler.getPlugin().getServer().getOnlinePlayers().size())); + line = line.replace("%queueing%", String.valueOf(getQueueing())); + line = line.replace("%fighting%", String.valueOf(getFighting())); + + line = line.replace("%kit%", queue.getKit().getName()); + line = line.replace("%time%", DurationUtil.getDuration(queue.getStartTime())); + + line = line.replace("%minElo%", String.valueOf(queue.getMinElo())); + line = line.replace("%maxElo%", String.valueOf(queue.getMaxElo())); + toReturn.add(line); + } + break; + } + case MATCH: { + Match match = practiceProfile.getMatch(); + Player opponent = match.getTeamOne().contains(player.getUniqueId()) ? match.getT2l() : match.getT1l(); + title = managerHandler.getPlugin().getConfig().getString("scoreboard." + (match.isRanked() ? "RANKED" : "UNRANKED") + "-MATCH.title"); + for (String line : managerHandler.getPlugin().getConfig().getStringList("scoreboard." + (match.isRanked() ? "RANKED" : "UNRANKED") + "-MATCH.slots")) { + line = line.replace("%online%", String.valueOf(this.managerHandler.getPlugin().getServer().getOnlinePlayers().size())); + line = line.replace("%queueing%", String.valueOf(getQueueing())); + line = line.replace("%fighting%", String.valueOf(getFighting())); + + line = line.replace("%kit%", match.getKit().getName()); + line = line.replace("%opponent%", opponent.getName()); + line = line.replace("%ping%", String.valueOf(BukkitReflection.getPing(player))); + line = line.replace("%opponentPing%", String.valueOf(BukkitReflection.getPing(opponent))); + line = line.replace("%time%", (match.getEndTime() != 0 ? DurationUtil.getDuration(match.getStartTime(), match.getEndTime()) : DurationUtil.getDuration(match.getStartTime()))); + toReturn.add(line); + } + break; + } + case EDITING: { + title = managerHandler.getPlugin().getConfig().getString("scoreboard.EDITING.title"); + for (String line : managerHandler.getPlugin().getConfig().getStringList("scoreboard.EDITING.slots")) { + line = line.replace("%online%", String.valueOf(this.managerHandler.getPlugin().getServer().getOnlinePlayers().size())); + line = line.replace("%queueing%", String.valueOf(getQueueing())); + line = line.replace("%fighting%", String.valueOf(getFighting())); + + line = line.replace("%kit%", practiceProfile.getEditing().getName()); + toReturn.add(line); + } + break; + } + case PARTY: { + Party party = practiceProfile.getParty(); + Player leader = this.managerHandler.getPlugin().getServer().getPlayer(party.getLeader()); + + title = managerHandler.getPlugin().getConfig().getString("scoreboard.PARTY-" + party.getPartyState().toString() + (party.getPartyState() == PartyState.MATCH && party.getMatch().getTeamTwo() == null ? "-FFA" : "") + (party.getPartyState() == PartyState.MATCH && party.getMatch().getKit() == null && practiceProfile.getHcfKit() == HCFKit.BARD ? "-BARD" : "") + ".title"); + for (String line : managerHandler.getPlugin().getConfig().getStringList("scoreboard.PARTY-" + party.getPartyState().toString() + (party.getPartyState() == PartyState.MATCH && party.getMatch().getTeamTwo() == null ? "-FFA" : "") + (party.getPartyState() == PartyState.MATCH && party.getMatch().getKit() == null && practiceProfile.getHcfKit() == HCFKit.BARD ? "-BARD" : "") + ".slots")) { + line = line.replace("%online%", String.valueOf(this.managerHandler.getPlugin().getServer().getOnlinePlayers().size())); + line = line.replace("%queueing%", String.valueOf(getQueueing())); + line = line.replace("%fighting%", String.valueOf(getFighting())); + + line = line.replace("%leader%", leader.getName()); + line = line.replace("%members%", String.valueOf(party.getMembers().size())); + + if (party.getPartyState() == PartyState.MATCH) { + Match match = party.getMatch(); + + if (match.getTeamTwo() != null) { + boolean t1 = match.getTeamOne().contains(player.getUniqueId()); + + line = line.replace("%alive%", String.valueOf(match.getAlive(t1))); + line = line.replace("%all%", String.valueOf(t1 ? match.getTeamOne().size() : match.getTeamTwo().size())); + line = line.replace("%ping%", String.valueOf(BukkitReflection.getPing(player))); + + line = line.replace("%opponentAlive%", String.valueOf(match.getAlive(!t1))); + line = line.replace("%opponentAll%", String.valueOf(t1 ? match.getTeamTwo().size() : match.getTeamOne().size())); + line = line.replace("%time%", (match.getEndTime() != 0 ? DurationUtil.getDuration(match.getStartTime(), match.getEndTime()) : DurationUtil.getDuration(match.getStartTime()))); + + if (match.getKit() == null && practiceProfile.getHcfKit() == HCFKit.BARD) { + line = line.replace("%energy%", String.valueOf(practiceProfile.getBardEnergy())); + } + } else { + line = line.replace("%alive%", String.valueOf(match.getAlive(true))); + line = line.replace("%all%", String.valueOf(match.getTeamOne().size())); + line = line.replace("%ping%", String.valueOf(BukkitReflection.getPing(player))); + + line = line.replace("%time%", (match.getEndTime() != 0 ? DurationUtil.getDuration(match.getStartTime(), match.getEndTime()) : DurationUtil.getDuration(match.getStartTime()))); + } + } + toReturn.add(line); + } + break; + } + case EVENT: { + HostedEvent hostedEvent = practiceProfile.getHostedEvent(); + title = managerHandler.getPlugin().getConfig().getString("scoreboard." + hostedEvent.getName().toUpperCase() + "-EVENT-" + hostedEvent.getEventState().toString() + ".title"); + for (String line : managerHandler.getPlugin().getConfig().getStringList("scoreboard." + hostedEvent.getName().toUpperCase() + "-EVENT-" + hostedEvent.getEventState().toString() + ".slots")) { + line = line.replace("%online%", String.valueOf(this.managerHandler.getPlugin().getServer().getOnlinePlayers().size())); + line = line.replace("%queueing%", String.valueOf(getQueueing())); + line = line.replace("%fighting%", String.valueOf(getFighting())); + + line = line.replace("%players%", String.valueOf(hostedEvent.getPlayers().size())); + line = line.replace("%max%", String.valueOf(this.managerHandler.getSettingsManager().getPlayersPerEvent())); + line = line.replace("%time%", hostedEvent.getStartTime() > 0 ? DurationUtil.getDuration(hostedEvent.getStartTime()) : DurationUtil.getDurationDown(hostedEvent.getDown(), 29)); + toReturn.add(line); + } + break; + } + case SPECTATING_EVENT: { + HostedEvent hostedEvent = practiceProfile.getHostedEvent(); + title = managerHandler.getPlugin().getConfig().getString("scoreboard." + hostedEvent.getName().toUpperCase() + "-EVENT-" + hostedEvent.getEventState().toString() + ".title"); + for (String line : managerHandler.getPlugin().getConfig().getStringList("scoreboard." + hostedEvent.getName().toUpperCase() + "-EVENT-" + hostedEvent.getEventState().toString() + ".slots")) { + line = line.replace("%online%", String.valueOf(this.managerHandler.getPlugin().getServer().getOnlinePlayers().size())); + line = line.replace("%queueing%", String.valueOf(getQueueing())); + line = line.replace("%fighting%", String.valueOf(getFighting())); + + line = line.replace("%players%", String.valueOf(hostedEvent.getPlayers().size())); + line = line.replace("%max%", String.valueOf(this.managerHandler.getSettingsManager().getPlayersPerEvent())); + line = line.replace("%time%", hostedEvent.getStartTime() > 0 ? DurationUtil.getDuration(hostedEvent.getStartTime()) : DurationUtil.getDurationDown(hostedEvent.getDown(), 29)); + toReturn.add(line); + } + break; + } + case TOURNAMENT: { + Tournament tournament = practiceProfile.getTournament(); + title = managerHandler.getPlugin().getConfig().getString("scoreboard.TOURNAMENT-" + tournament.getTournamentState().toString() + ".title"); + for (String line : managerHandler.getPlugin().getConfig().getStringList("scoreboard.TOURNAMENT-" + tournament.getTournamentState().toString() + ".slots")) { + line = line.replace("%online%", String.valueOf(this.managerHandler.getPlugin().getServer().getOnlinePlayers().size())); + line = line.replace("%queueing%", String.valueOf(getQueueing())); + line = line.replace("%fighting%", String.valueOf(getFighting())); + + line = line.replace("%players%", String.valueOf(tournament.getParticipants().size())); + line = line.replace("%max%", String.valueOf(this.managerHandler.getSettingsManager().getPlayersPerTournament())); + line = line.replace("%time%", tournament.getStartTime() > 0 ? DurationUtil.getDuration(tournament.getStartTime()) : DurationUtil.getDurationDown(tournament.getDown(), 59)); + line = line.replace("%round%", String.valueOf(tournament.getRound())); + line = line.replace("%kit%", tournament.getKit().getName()); + toReturn.add(line); + } + break; + } + case SPECTATING: { + Match match = practiceProfile.getSpectating(); + title = managerHandler.getPlugin().getConfig().getString("scoreboard.SPECTATING.title"); + for (String line : managerHandler.getPlugin().getConfig().getStringList("scoreboard.SPECTATING.slots")) { + line = line.replace("%online%", String.valueOf(this.managerHandler.getPlugin().getServer().getOnlinePlayers().size())); + line = line.replace("%queueing%", String.valueOf(getQueueing())); + line = line.replace("%fighting%", String.valueOf(getFighting())); + + line = line.replace("%kit%", match.getKit().getName()); + line = line.replace("%player1%", match.getT1l().getName()); + line = line.replace("%player2%", match.getT2l().getName()); + toReturn.add(line); + } + } + } + if (!practiceProfile.isScoreboard()) { + toReturn.clear(); + } + scoreHelper.setTitle(title); + scoreHelper.setSlotsFromList(toReturn); + } catch (Exception ex) { + //remove the errors :3 + } + } + + private int getQueueing() { + int queueing = 0; + for (Kit kit : this.managerHandler.getKitManager().getKitsList()) { + queueing += kit.getUnrankedQueue().size() + kit.getRankedQueue().size(); + } + return queueing; + } + + private int getFighting() { + int fighting = 0; + for (Kit kit : this.managerHandler.getKitManager().getKitsList()) { + fighting += kit.getUnrankedMatch().size() + kit.getRankedMatch().size(); + } + return fighting; + } + +} diff --git a/src/main/java/me/abhi/practice/manager/impl/SettingsManager.java b/src/main/java/me/abhi/practice/manager/impl/SettingsManager.java new file mode 100644 index 0000000..533a2e8 --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/impl/SettingsManager.java @@ -0,0 +1,69 @@ +package me.abhi.practice.manager.impl; + +import lombok.Getter; +import lombok.Setter; +import me.abhi.practice.manager.Manager; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.util.LocationUtil; +import org.bukkit.Location; + + +@Getter +@Setter +public class SettingsManager extends Manager { + + private Location spawn; + private Location editor; + + private int defaultElo; + private int maxElo; + private int minElo; + private int maxPartyMembers; + private boolean lightningEffect; + private boolean deleteBottles; + private long eventDelay; + private int playersPerEvent; + private int playersPerTournament; + private boolean showPlayers; + private boolean leaderboardsGUI; + private boolean voidSpawn; + private boolean hideInvisiblesInTab; + private String partyChatFormat; + + public SettingsManager(ManagerHandler managerHandler) { + super(managerHandler); + + fetch(); + } + + private void fetch() { + if (managerHandler.getPlugin().getConfig().get("spawn") != null) + spawn = LocationUtil.getLocationFromString(managerHandler.getPlugin().getConfig().getString("spawn")); + if (managerHandler.getPlugin().getConfig().get("editor") != null) + editor = LocationUtil.getLocationFromString(managerHandler.getPlugin().getConfig().getString("editor")); + + defaultElo = managerHandler.getPlugin().getConfig().getInt("settings.default-elo"); + maxElo = managerHandler.getPlugin().getConfig().getInt("settings.max-elo"); + minElo = managerHandler.getPlugin().getConfig().getInt("settings.min-elo"); + maxPartyMembers = managerHandler.getPlugin().getConfig().getInt("settings.max-party-members"); + lightningEffect = managerHandler.getPlugin().getConfig().getBoolean("settings.lightning-effect"); + deleteBottles = managerHandler.getPlugin().getConfig().getBoolean("settings.delete-bottles"); + eventDelay = managerHandler.getPlugin().getConfig().getInt("settings.event-delay") * 60000; + playersPerEvent = managerHandler.getPlugin().getConfig().getInt("settings.players-per-event"); + playersPerTournament = managerHandler.getPlugin().getConfig().getInt("settings.players-per-tournament"); + showPlayers = managerHandler.getPlugin().getConfig().getBoolean("settings.show-players"); + leaderboardsGUI = managerHandler.getPlugin().getConfig().getBoolean("settings.leaderboards-gui"); + voidSpawn = managerHandler.getPlugin().getConfig().getBoolean("settings.void-spawn"); + hideInvisiblesInTab = managerHandler.getPlugin().getConfig().getBoolean("settings.hide-invisibles-in-tab"); + partyChatFormat = managerHandler.getPlugin().getConfig().getString("party-chat-format"); + } + + public void save() { + if (spawn != null) + managerHandler.getPlugin().getConfig().set("spawn", LocationUtil.getStringFromLocation(spawn)); + if (editor != null) + managerHandler.getPlugin().getConfig().set("editor", LocationUtil.getStringFromLocation(editor)); + + managerHandler.getPlugin().saveConfig(); + } +} diff --git a/src/main/java/me/abhi/practice/manager/impl/TournamentManager.java b/src/main/java/me/abhi/practice/manager/impl/TournamentManager.java new file mode 100644 index 0000000..ba3b7ff --- /dev/null +++ b/src/main/java/me/abhi/practice/manager/impl/TournamentManager.java @@ -0,0 +1,58 @@ +package me.abhi.practice.manager.impl; + +import lombok.Getter; +import lombok.Setter; +import me.abhi.practice.manager.Manager; +import me.abhi.practice.manager.ManagerHandler; +import me.abhi.practice.tournament.Tournament; +import me.abhi.practice.tournament.TournamentState; +import me.abhi.practice.util.enums.Messages; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.scheduler.BukkitRunnable; + +@Setter +@Getter +public class TournamentManager extends Manager { + + private Tournament tournament; + + public TournamentManager(ManagerHandler managerHandler) { + super(managerHandler); + } + + public void next() { + try { + tournament.setDown(System.currentTimeMillis()); + new BukkitRunnable() { + int i = tournament.getRound() > 1 ? 30 : 60; + + public void run() { + if (tournament == null || (tournament.getTournamentState() != TournamentState.STARTING && tournament.getTournamentState() != TournamentState.WAITING)) { + this.cancel(); + return; + } + if (i % 10 == 0 && tournament.getTournamentState() == TournamentState.STARTING) { + TextComponent clickable = new TextComponent(Messages.TOURNAMENT_STARTING.getMessage().replace("%kit%", tournament.getKit().getName())); + clickable.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tournament join")); + clickable.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(Messages.TOURNAMENT_HOVER.getMessage().replace("%kit%", tournament.getKit().getName())).create())); + + managerHandler.getPlugin().getServer().getOnlinePlayers().stream().forEach(p -> p.spigot().sendMessage(clickable)); + } + i -= 1; + if (i == 0) { + tournament.setStartTime(System.currentTimeMillis()); + tournament.startRound(); + + tournament.setTournamentState(TournamentState.STARTED); + this.cancel(); + } + } + }.runTaskTimer(managerHandler.getPlugin(), 0L, 20L); + } catch (Exception ex) { + // get rid of errors ;3 + } + } +} diff --git a/src/main/java/me/abhi/practice/match/Match.java b/src/main/java/me/abhi/practice/match/Match.java new file mode 100644 index 0000000..8b0e2d2 --- /dev/null +++ b/src/main/java/me/abhi/practice/match/Match.java @@ -0,0 +1,565 @@ +package me.abhi.practice.match; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.arena.Arena; +import me.abhi.practice.kit.CustomKit; +import me.abhi.practice.kit.Kit; +import me.abhi.practice.kit.KitType; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyState; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.task.player.BardTask; +import me.abhi.practice.tournament.Tournament; +import me.abhi.practice.tournament.TournamentState; +import me.abhi.practice.util.EloUtil; +import me.abhi.practice.util.enums.Items; +import me.abhi.practice.util.enums.Messages; +import me.abhi.practice.util.misc.CC; +import me.abhi.practice.util.misc.InventorySnapshot; +import me.abhi.practice.util.misc.ItemBuilder; +import me.abhi.practice.util.misc.ScoreHelper; +import me.abhi.practice.util.reflection.BukkitReflection; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.GameMode; +import org.bukkit.OfflinePlayer; +import org.bukkit.Sound; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; + +@SuppressWarnings("Duplicates") +@Getter +@RequiredArgsConstructor +public class Match { + + private final PracticePlugin plugin; + private final Kit kit; + private final List teamOne; + private final List teamTwo; + private final boolean ranked; + private final boolean tournament; + + private Player t1l; + private Player t2l; + + private PracticeProfile t1lp; + private PracticeProfile t2lp; + + private List spectators = new ArrayList<>(); + private List dead = new ArrayList<>(); + private List items = new ArrayList<>(); + private List exempt = new ArrayList<>(); + + private Arena arena; + private long startTime = 0; + private long endTime = 0; + + private MatchState matchState = MatchState.STARTING; + + private boolean party; + + public void start() { + + t1l = this.plugin.getServer().getPlayer(teamOne.get(0)); + if (teamTwo != null) t2l = this.plugin.getServer().getPlayer(teamTwo.get(0)); + + t1lp = this.plugin.getManagerHandler().getProfileManager().getProfile(t1l); + if (teamTwo != null) t2lp = this.plugin.getManagerHandler().getProfileManager().getProfile(t2l); + + party = t1lp.getPlayerState() == PlayerState.PARTY || teamTwo != null && t2lp.getPlayerState() == PlayerState.PARTY; + + arena = (kit != null ? this.plugin.getManagerHandler().getArenaManager().randomArena(kit) : this.plugin.getManagerHandler().getArenaManager().randomArena(KitType.HCF)); + + arena.getL1().getChunk().load(); + teamOne.forEach(u -> { + Player player = this.plugin.getServer().getPlayer(u); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + if (teamTwo != null) { + player.sendMessage(ranked ? Messages.RANKED_MATCH_FOUND.getMessage().replace("%player%", t2l.getName() + (party ? "'s Team" : "")).replace("%elo%", String.valueOf(t2lp.getElo(kit))).replace("%kit%", kit != null ? kit.getName() : "HCF") : Messages.UNRANKED_MATCH_FOUND.getMessage().replace("%player%", t2l.getName() + (party ? "'s Team" : "")).replace("%kit%", kit != null ? kit.getName() : "HCF")); + hide(player); + } else { + player.sendMessage(Messages.PARTY_FFA_STARTING.getMessage()); + } + + this.plugin.getManagerHandler().getPlayerManager().resetPlayer(player); + this.plugin.getManagerHandler().getPlayerManager().hideAll(player); + + if (kit != null) { + boolean hasKits = false; + for (int i = 1; i <= 7; i++) { + if (practiceProfile.getCustomKit(kit, i) != null) { + hasKits = true; + + CustomKit customKit = practiceProfile.getCustomKit(kit, i); + + ItemStack clone = Items.CUSTOM_KIT.getItem().clone(); + String name = customKit.getName().replace("%kit%", kit.getName()).replace("%number%", String.valueOf(i)); + player.getInventory().setItem(i - 1, new ItemBuilder(clone.getType()).setDurability(clone.getDurability()).setName(name).toItemStack()); + } + } + if (!hasKits) { + player.getInventory().setContents(kit.getInventory().getContents()); + player.getInventory().setArmorContents(kit.getArmor()); + } else { + player.getInventory().setItem(8, Items.DEFAULT_KIT.getItem()); + } + } else { + player.getInventory().setContents(practiceProfile.getHcfKit().getInventory().getContents()); + player.getInventory().setArmorContents(practiceProfile.getHcfKit().getArmor()); + + switch (practiceProfile.getHcfKit()) { + case BARD: { + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 1)); + player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, Integer.MAX_VALUE, 1)); + player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, Integer.MAX_VALUE, 1)); + + new BardTask(this.plugin, player).runTaskTimer(this.plugin, 0L, 0L); + break; + } + case ARCHER: { + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 2)); + break; + } + case ROGUE: { + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 2)); + player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, Integer.MAX_VALUE, 2)); + player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, Integer.MAX_VALUE, 2)); + break; + } + } + } + player.updateInventory(); + + player.teleport(arena.getL1()); + if (kit != null) player.setMaximumNoDamageTicks(kit.getDamageTicks()); + + ScoreHelper scoreHelper = ScoreHelper.getByPlayer(player); + + teamOne.forEach(u1 -> { + Player player1 = this.plugin.getServer().getPlayer(u1); + + player.showPlayer(player1); + if (teamTwo != null) { + scoreHelper.addFriendly(player1); + } else { + scoreHelper.addEnemy(player1); + + player.showPlayer(player1); + } + }); + + if (teamTwo != null) teamTwo.forEach(u1 -> { + Player player1 = this.plugin.getServer().getPlayer(u1); + + player.showPlayer(player1); + scoreHelper.addEnemy(player1); + }); + }); + + if (teamTwo != null) { + + arena.getL2().getChunk().load(); + teamTwo.forEach(u -> { + Player player = this.plugin.getServer().getPlayer(u); + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + player.sendMessage(ranked ? Messages.RANKED_MATCH_FOUND.getMessage().replace("%player%", t1l.getName() + (party ? "'s Team" : "")).replace("%elo%", String.valueOf(t1lp.getElo(kit))).replace("%kit%", kit != null ? kit.getName() : "HCF") : Messages.UNRANKED_MATCH_FOUND.getMessage().replace("%player%", t1l.getName() + (party ? "'s Team" : "")).replace("%kit%", kit != null ? kit.getName() : "HCF")); + hide(player); + + this.plugin.getManagerHandler().getPlayerManager().resetPlayer(player); + this.plugin.getManagerHandler().getPlayerManager().hideAll(player); + + if (kit != null) { + boolean hasKits = false; + for (int i = 1; i <= 7; i++) { + if (practiceProfile.getCustomKit(kit, i) != null) { + hasKits = true; + + CustomKit customKit = practiceProfile.getCustomKit(kit, i); + + ItemStack clone = Items.CUSTOM_KIT.getItem().clone(); + String name = customKit.getName().replace("%kit%", kit.getName()).replace("%number%", String.valueOf(i)); + player.getInventory().setItem(i - 1, new ItemBuilder(clone.getType()).setDurability(clone.getDurability()).setName(name).toItemStack()); + } + } + if (!hasKits) { + player.getInventory().setContents(kit.getInventory().getContents()); + player.getInventory().setArmorContents(kit.getArmor()); + } else { + player.getInventory().setItem(8, Items.DEFAULT_KIT.getItem()); + } + } else { + player.getInventory().setContents(practiceProfile.getHcfKit().getInventory().getContents()); + player.getInventory().setArmorContents(practiceProfile.getHcfKit().getArmor()); + + switch (practiceProfile.getHcfKit()) { + case BARD: { + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 1)); + player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, Integer.MAX_VALUE, 1)); + player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, Integer.MAX_VALUE, 1)); + + new BardTask(this.plugin, player).runTaskTimer(this.plugin, 0L, 0L); + break; + } + case ARCHER: { + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 2)); + break; + } + case ROGUE: { + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 2)); + player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, Integer.MAX_VALUE, 2)); + player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, Integer.MAX_VALUE, 2)); + break; + } + } + } + player.updateInventory(); + + player.teleport(arena.getL2()); + if (kit != null) player.setMaximumNoDamageTicks(kit.getDamageTicks()); + + + ScoreHelper scoreHelper = ScoreHelper.getByPlayer(player); + + teamTwo.forEach(u1 -> { + Player player1 = this.plugin.getServer().getPlayer(u1); + + player.showPlayer(player1); + scoreHelper.addFriendly(player1); + }); + + teamOne.forEach(u1 -> { + Player player1 = this.plugin.getServer().getPlayer(u1); + + player.showPlayer(player1); + scoreHelper.addEnemy(player1); + }); + }); + } + new BukkitRunnable() { + int i = 5; + + public void run() { + if (matchState != MatchState.STARTING) { + this.cancel(); + return; + } + if (i > 0) { + broadcast(Messages.MATCH_STARTING.getMessage().replace("%time%", String.valueOf(i))); + playSound(Sound.NOTE_STICKS); + } + i--; + if (i == -1) { + this.cancel(); + + broadcast(Messages.MATCH_STARTED.getMessage()); + playSound(Sound.NOTE_PLING); + + matchState = MatchState.STARTED; + startTime = System.currentTimeMillis(); + return; + } + } + }.runTaskTimerAsynchronously(this.plugin, 20L, 20L); + } + + public void addDeath(Player player, MatchDeathReason matchDeathReason, Player killer) { + if (dead.contains(player.getUniqueId()) || matchState == MatchState.ENDING) return; + dead.add(player.getUniqueId()); + + player.setGameMode(GameMode.CREATIVE); + + List allPlayers = new ArrayList<>(); + teamOne.forEach(allPlayers::add); + if (teamTwo != null) teamTwo.forEach(allPlayers::add); + spectators.forEach(allPlayers::add); + + if (this.plugin.getManagerHandler().getSettingsManager().isLightningEffect()) + BukkitReflection.sendLightning(player, player.getLocation()); + + allPlayers.stream().filter(u -> !exempt.contains(u)).forEach(u -> { + Player players = this.plugin.getServer().getPlayer(u); + + players.hidePlayer(player); + + if (this.plugin.getManagerHandler().getSettingsManager().isLightningEffect()) + BukkitReflection.sendLightning(players, player.getLocation()); + }); + + new InventorySnapshot(player); + + this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, () -> { + this.plugin.getManagerHandler().getPlayerManager().resetPlayer(player); + }, 5L); + + switch (matchDeathReason) { + case DISCONNECTED: { + broadcast(Messages.PLAYER_DEATH_DISCONNECTED.getMessage().replace("%player%", player.getName())); + exempt.add(player.getUniqueId()); + break; + } + case KILLED: { + broadcast(Messages.PLAYER_DEATH_KILLED.getMessage().replace("%player%", player.getName()).replace("%killer%", killer.getName())); + break; + } + case DIED: { + broadcast(Messages.PLAYER_DEATH_DIED.getMessage().replace("%player%", player.getName())); + break; + } + case LEFT: { + broadcast(Messages.PLAYER_DEATH_LEFT.getMessage().replace("%player%", player.getName())); + exempt.add(player.getUniqueId()); + break; + } + } + if (getAlive(true) == (teamTwo == null ? 1 : 0)) end(teamTwo == null); + if (teamTwo != null && getAlive(false) == 0) end(true); + } + + public void end(boolean t1) { + + if (matchState == MatchState.ENDING) return; + + + matchState = MatchState.ENDING; + + endTime = System.currentTimeMillis(); + + String[] parts = Messages.MATCH_END.getMessage().split("\n"); + + TextComponent winnerNames = new TextComponent(""); + (t1 ? teamOne : teamTwo).forEach(u -> { + if ((teamTwo == null && !dead.contains(u)) || teamTwo != null) { + OfflinePlayer offlinePlayer = this.plugin.getServer().getOfflinePlayer(u); + TextComponent winnerName = new TextComponent(CC.GREEN + offlinePlayer.getName()); + winnerName.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(Messages.INVENTORY_HOVER.getMessage().replace("%player%", offlinePlayer.getName())).create())); + winnerName.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/inventory " + offlinePlayer.getName())); + winnerNames.addExtra(winnerName); + winnerNames.addExtra(" "); + } + }); + TextComponent loserNames = new TextComponent(""); + (t1 ? teamTwo != null ? teamTwo : dead : teamOne).forEach(u -> { + OfflinePlayer offlinePlayer = this.plugin.getServer().getOfflinePlayer(u); + TextComponent loserName = new TextComponent(CC.RED + offlinePlayer.getName()); + loserName.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(Messages.INVENTORY_HOVER.getMessage().replace("%player%", offlinePlayer.getName())).create())); + loserName.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/inventory " + offlinePlayer.getName())); + loserNames.addExtra(loserName); + loserNames.addExtra(" "); + }); + Map excluded = new HashMap<>(); + for (String part : parts) { + if (CC.strip(part).contains("%winnerNames%")) { + String[] breakdown = part.split("%winnerNames%"); + + TextComponent textComponent = null; + if (!CC.strip(part).equalsIgnoreCase("%winnerNames%")) { + textComponent = new TextComponent(CC.translate(breakdown[0])); + textComponent.addExtra(winnerNames); + + if (breakdown.length >= 1) { + for (int i = 1; i < breakdown.length; i++) { + if (i > 1) { + textComponent.addExtra(winnerNames); + } + textComponent.addExtra(breakdown[i]); + } + } + } else { + textComponent = winnerNames; + } + excluded.put(Arrays.asList(parts).indexOf(part), textComponent); + } + } + for (String part : parts) { + if (CC.strip(part).contains("%loserNames%")) { + String[] breakdown = part.split("%loserNames%"); + + TextComponent textComponent = null; + if (!CC.strip(part).equalsIgnoreCase("%loserNames%")) { + textComponent = new TextComponent(CC.translate(breakdown[0])); + textComponent.addExtra(loserNames); + + if (breakdown.length >= 1) { + for (int i = 1; i < breakdown.length; i++) { + if (i > 1) { + textComponent.addExtra(loserNames); + } + textComponent.addExtra(breakdown[i]); + } + } + } else { + textComponent = loserNames; + } + excluded.put(Arrays.asList(parts).indexOf(part), textComponent); + } + } + for (int i = 0; i < parts.length; i++) { + if (excluded.containsKey(i)) { + broadcast(excluded.get(i)); + } else { + broadcast(parts[i]); + } + } + if (ranked) { + int[] newElo = EloUtil.getNewRankings(t1lp.getElo(kit), t2lp.getElo(kit), t1); + int eloDifference = Math.abs(newElo[0] - t1lp.getElo(kit)); + + t1lp.setElo(kit, newElo[0] <= this.plugin.getManagerHandler().getSettingsManager().getMinElo() ? this.plugin.getManagerHandler().getSettingsManager().getMinElo() : (newElo[0] >= this.plugin.getManagerHandler().getSettingsManager().getMaxElo() ? this.plugin.getManagerHandler().getSettingsManager().getMaxElo() : newElo[0])); + t2lp.setElo(kit, newElo[1] <= this.plugin.getManagerHandler().getSettingsManager().getMinElo() ? this.plugin.getManagerHandler().getSettingsManager().getMinElo() : (newElo[1] >= this.plugin.getManagerHandler().getSettingsManager().getMaxElo() ? this.plugin.getManagerHandler().getSettingsManager().getMaxElo() : newElo[1])); + + Player winner = t1 ? t1l : t2l; + PracticeProfile wp = this.plugin.getManagerHandler().getProfileManager().getProfile(winner); + + Player loser = t1 ? t2l : t1l; + PracticeProfile lp = this.plugin.getManagerHandler().getProfileManager().getProfile(loser); + + String eloChanges = Messages.ELO_CHANGES.getMessage().replace("%winner%", winner.getName()).replace("%loser%", loser.getName()).replace("%newWinnerElo%", String.valueOf(wp.getElo(kit))).replace("%newLoserElo%", String.valueOf(lp.getElo(kit))).replace("%eloDifference%", String.valueOf(eloDifference)); + + broadcast(eloChanges); + } + + List allPlayers = new ArrayList<>(); + + teamOne.stream().filter(u -> !exempt.contains(u)).forEach(allPlayers::add); + if (teamTwo != null) teamTwo.stream().filter(u -> !exempt.contains(u)).forEach(allPlayers::add); + spectators.stream().filter(u -> !exempt.contains(u)).forEach(allPlayers::add); + + for (UUID uuid : allPlayers) { + Player player = this.plugin.getServer().getPlayer(uuid); + + new InventorySnapshot(player); + } + + this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> { + + items.forEach(Item::remove); + + allPlayers.stream().forEach(u -> { + Player player = this.plugin.getServer().getPlayer(u); + + if (kit != null) teamOne.stream().forEach(u1 -> kit.getUnrankedMatch().remove(u1)); + if (kit != null) teamOne.stream().forEach(u1 -> kit.getRankedMatch().remove(u1)); + + if (teamTwo != null && kit != null) teamTwo.stream().forEach(u1 -> kit.getUnrankedMatch().remove(u1)); + if (teamTwo != null && kit != null) teamTwo.stream().forEach(u1 -> kit.getRankedMatch().remove(u1)); + + if (player != null) { + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + practiceProfile.setHits(0); + practiceProfile.setCombo(0); + practiceProfile.setLongestCombo(0); + practiceProfile.setThrownPots(0); + practiceProfile.setFullyLandedPots(0); + + practiceProfile.setPlayerState(practiceProfile.getParty() != null ? PlayerState.PARTY : PlayerState.LOBBY); + practiceProfile.setPlayerState(practiceProfile.getParty() != null ? PlayerState.PARTY : PlayerState.LOBBY); + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + this.plugin.getManagerHandler().getPlayerManager().teleportSpawn(player); + + ScoreHelper scoreHelper = ScoreHelper.getByPlayer(player); + scoreHelper.resetEnemy(); + scoreHelper.resetFriendly(); + + if (party) { + Party p1 = t1lp.getParty(); + + if (p1 != null) { + p1.setPartyState(PartyState.LOBBY); + p1.setMatch(null); + } + + if (teamTwo != null) { + Party p2 = t2lp.getParty(); + + if (p2 != null) { + p2.setPartyState(PartyState.LOBBY); + p2.setMatch(null); + } + } + } + return; + } + }); + + if (tournament) { + Tournament tournament = this.plugin.getManagerHandler().getTournamentManager().getTournament(); + tournament.getMatchList().remove(this); + + tournament.broadcast(Messages.PLAYER_ELIMINATED_TOURNAMENT.getMessage().replace("%player%", (t1 ? t2l : t1l).getName())); + tournament.getParticipants().remove(t1 ? t2l.getUniqueId() : t1l.getUniqueId()); + + (t1 ? t1lp : t2lp).setPlayerState(PlayerState.TOURNAMENT); + this.plugin.getManagerHandler().getPlayerManager().giveItems(t1 ? t1l : t2l, true); + + if (tournament.getParticipants().size() == 1) { + Player winner = this.plugin.getServer().getPlayer(tournament.getParticipants().get(0)); + + tournament.end(winner.getName()); + } else if (tournament.getParticipants().size() == 0) { + tournament.end(null); + } else if (tournament.getMatchList().size() == 0) { + + tournament.setStartTime(0); + tournament.setRound(tournament.getRound() + 1); + + tournament.setTournamentState(TournamentState.WAITING); + this.plugin.getServer().broadcastMessage(Messages.TOURNAMENT_NEXT_ROUND.getMessage().replace("%round%", String.valueOf(tournament.getRound()))); + this.plugin.getManagerHandler().getTournamentManager().next(); + } + } + }, 60L); + } + + public int getAlive(boolean t1) { + int alive = 0; + for (UUID uuid : t1 ? teamOne : teamTwo) { + if (!dead.contains(uuid)) alive += 1; + } + return alive; + } + + public void broadcast(String message) { + List allPlayers = new ArrayList<>(); + teamOne.stream().filter(u -> !exempt.contains(u)).forEach(allPlayers::add); + if (teamTwo != null) teamTwo.stream().filter(u -> !exempt.contains(u)).forEach(allPlayers::add); + spectators.stream().filter(u -> !exempt.contains(u)).forEach(allPlayers::add); + + allPlayers.stream().filter(u -> this.plugin.getServer().getPlayer(u) != null).forEach(u -> this.plugin.getServer().getPlayer(u).sendMessage(message)); + } + + public void broadcast(TextComponent message) { + List allPlayers = new ArrayList<>(); + teamOne.stream().filter(u -> !exempt.contains(u)).forEach(allPlayers::add); + if (teamTwo != null) teamTwo.stream().filter(u -> !exempt.contains(u)).forEach(allPlayers::add); + spectators.stream().filter(u -> !exempt.contains(u)).forEach(allPlayers::add); + + allPlayers.stream().filter(u -> this.plugin.getServer().getPlayer(u) != null).forEach(u -> this.plugin.getServer().getPlayer(u).spigot().sendMessage(message)); + } + + public void playSound(Sound sound) { + List allPlayers = new ArrayList<>(); + teamOne.stream().filter(u -> !exempt.contains(u)).forEach(allPlayers::add); + if (teamTwo != null) teamTwo.stream().filter(u -> !exempt.contains(u)).forEach(allPlayers::add); + spectators.stream().filter(u -> !exempt.contains(u)).forEach(allPlayers::add); + + allPlayers.stream().filter(u -> this.plugin.getServer().getPlayer(u) != null).forEach(u -> this.plugin.getServer().getPlayer(u).playSound(this.plugin.getServer().getPlayer(u).getLocation(), sound, 20f, 20f)); + } + + private void hide(Player player) { + this.plugin.getServer().getOnlinePlayers().stream().filter(p -> !teamOne.contains(((Player) p).getUniqueId()) && !teamTwo.contains(((Player) p).getUniqueId()) && !spectators.contains(((Player) p).getUniqueId())).forEach(player::hidePlayer); + } +} diff --git a/src/main/java/me/abhi/practice/match/MatchDeathReason.java b/src/main/java/me/abhi/practice/match/MatchDeathReason.java new file mode 100644 index 0000000..cdb2020 --- /dev/null +++ b/src/main/java/me/abhi/practice/match/MatchDeathReason.java @@ -0,0 +1,6 @@ +package me.abhi.practice.match; + +public enum MatchDeathReason { + + KILLED, DIED, DISCONNECTED, LEFT +} diff --git a/src/main/java/me/abhi/practice/match/MatchRequest.java b/src/main/java/me/abhi/practice/match/MatchRequest.java new file mode 100644 index 0000000..df1b422 --- /dev/null +++ b/src/main/java/me/abhi/practice/match/MatchRequest.java @@ -0,0 +1,18 @@ +package me.abhi.practice.match; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import me.abhi.practice.kit.Kit; + +import java.util.UUID; + +@Getter +@RequiredArgsConstructor +public class MatchRequest { + + private final UUID requester; + private final Kit kit; + private final boolean party; + private long timestamp = System.currentTimeMillis(); + +} diff --git a/src/main/java/me/abhi/practice/match/MatchState.java b/src/main/java/me/abhi/practice/match/MatchState.java new file mode 100644 index 0000000..9b7df43 --- /dev/null +++ b/src/main/java/me/abhi/practice/match/MatchState.java @@ -0,0 +1,7 @@ +package me.abhi.practice.match; + +public enum MatchState { + + STARTING, STARTED, ENDING + +} diff --git a/src/main/java/me/abhi/practice/party/Party.java b/src/main/java/me/abhi/practice/party/Party.java new file mode 100644 index 0000000..1158ce2 --- /dev/null +++ b/src/main/java/me/abhi/practice/party/Party.java @@ -0,0 +1,34 @@ +package me.abhi.practice.party; + +import lombok.Getter; +import lombok.Setter; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.match.Match; +import me.abhi.practice.match.MatchRequest; +import net.md_5.bungee.api.chat.TextComponent; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +public class Party { + + private UUID leader; + private PartyState partyState = PartyState.LOBBY; + private Match match; + private List members = new ArrayList<>(); + private boolean open; + private List matchRequestList = new ArrayList<>(); + private Party dueling; + + public void broadcast(String message) { + members.forEach(u -> PracticePlugin.getInstance().getServer().getPlayer(u).sendMessage(message)); + } + + public void broadcast(TextComponent message) { + members.forEach(u -> PracticePlugin.getInstance().getServer().getPlayer(u).spigot().sendMessage(message)); + } + +} diff --git a/src/main/java/me/abhi/practice/party/PartyInvite.java b/src/main/java/me/abhi/practice/party/PartyInvite.java new file mode 100644 index 0000000..9561f53 --- /dev/null +++ b/src/main/java/me/abhi/practice/party/PartyInvite.java @@ -0,0 +1,12 @@ +package me.abhi.practice.party; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class PartyInvite { + + private final Party party; + private long timestamp = System.currentTimeMillis(); +} diff --git a/src/main/java/me/abhi/practice/party/PartyState.java b/src/main/java/me/abhi/practice/party/PartyState.java new file mode 100644 index 0000000..495ab7f --- /dev/null +++ b/src/main/java/me/abhi/practice/party/PartyState.java @@ -0,0 +1,6 @@ +package me.abhi.practice.party; + +public enum PartyState { + + LOBBY, QUEUE, MATCH +} diff --git a/src/main/java/me/abhi/practice/player/LeaderboardPlayer.java b/src/main/java/me/abhi/practice/player/LeaderboardPlayer.java new file mode 100644 index 0000000..926eb09 --- /dev/null +++ b/src/main/java/me/abhi/practice/player/LeaderboardPlayer.java @@ -0,0 +1,12 @@ +package me.abhi.practice.player; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class LeaderboardPlayer { + + private String name; + private int elo; +} diff --git a/src/main/java/me/abhi/practice/player/PlayerState.java b/src/main/java/me/abhi/practice/player/PlayerState.java new file mode 100644 index 0000000..139d9bf --- /dev/null +++ b/src/main/java/me/abhi/practice/player/PlayerState.java @@ -0,0 +1,6 @@ +package me.abhi.practice.player; + +public enum PlayerState { + + LOBBY, QUEUE, PARTY, MATCH, EDITING, EVENT, TOURNAMENT, SPECTATING, SPECTATING_EVENT +} diff --git a/src/main/java/me/abhi/practice/player/PracticeProfile.java b/src/main/java/me/abhi/practice/player/PracticeProfile.java new file mode 100644 index 0000000..23959b0 --- /dev/null +++ b/src/main/java/me/abhi/practice/player/PracticeProfile.java @@ -0,0 +1,113 @@ +package me.abhi.practice.player; + +import lombok.Getter; +import lombok.Setter; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.hostedevent.HostedEvent; +import me.abhi.practice.kit.CustomKit; +import me.abhi.practice.kit.Kit; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.match.Match; +import me.abhi.practice.match.MatchRequest; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyInvite; +import me.abhi.practice.queue.Queue; +import me.abhi.practice.tournament.Tournament; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Getter +@Setter +public class PracticeProfile { + + private boolean openInventory; + private Kit editInv; + private boolean scoreboard = true; + private PlayerState playerState = PlayerState.LOBBY; + private Queue queue; + private Party party; + private Match match; + private long lastEnderpearl; + private Map eloMap = new HashMap<>(); + private Kit editing; + private Map> customKitMap = new HashMap<>(); + private Inventory editLayoutInventory; + private Inventory hcfKitSelectorInventory; + private CustomKit settingName; + private List partyInviteList = new ArrayList<>(); + private Match spectating; + private boolean buildMode; + private HCFKit hcfKit = HCFKit.DIAMOND; + private List matchRequestList = new ArrayList<>(); + private Player dueling; + private long lastBardBuff; + private double bardEnergy; + private List activeBardItems = new ArrayList<>(); + private List potionEffectsList = new ArrayList<>(); + private long lastArcherSpeedBuff; + private long lastArcherJumpBuff; + private long lastArcherMark; + private long lastRogueSpeedBuff; + private long lastRogueJumpBuff; + private long lastRogueBackstab; + private HostedEvent hostedEvent; + private Tournament tournament; + private boolean viewingPlayerInv; + private boolean silentMode; + private boolean duelRequests = true; + private int hits; + private int combo; + private int longestCombo; + private int thrownPots; + private int fullyLandedPots; + + public int getElo(Kit kit) { + return eloMap.getOrDefault(kit, PracticePlugin.getInstance().getManagerHandler().getSettingsManager().getDefaultElo()); + } + + public void setElo(Kit kit, int elo) { + eloMap.put(kit, elo); + } + + public CustomKit getCustomKit(Kit kit, int number) { + CustomKit customKit = null; + if (customKitMap.containsKey(kit)) { + for (CustomKit customKits : customKitMap.get(kit)) { + if (customKits.getNumber() == number) customKit = customKits; + } + } + return customKit; + } + + public void setCustomKit(Kit kit, CustomKit customKit) { + ArrayList customKits = customKitMap.getOrDefault(kit, new ArrayList<>()); + customKits.add(customKit); + + customKitMap.put(kit, customKits); + } + + public void removeCustomKit(Kit kit, int number) { + CustomKit customKit = getCustomKit(kit, number); + + ArrayList customKits = customKitMap.getOrDefault(kit, new ArrayList<>()); + customKits.remove(customKit); + + customKitMap.put(kit, customKits); + } + + public PotionEffect getPotionEffect(PotionEffectType potionEffectType) { + PotionEffect potionEffect = null; + for (PotionEffect potionEffects : potionEffectsList) { + if (potionEffects.getType().getName().equalsIgnoreCase(potionEffectType.getName())) + potionEffect = potionEffects; + } + return potionEffect; + } +} diff --git a/src/main/java/me/abhi/practice/queue/Queue.java b/src/main/java/me/abhi/practice/queue/Queue.java new file mode 100644 index 0000000..266047e --- /dev/null +++ b/src/main/java/me/abhi/practice/queue/Queue.java @@ -0,0 +1,21 @@ +package me.abhi.practice.queue; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import me.abhi.practice.kit.Kit; + +@Getter +@RequiredArgsConstructor +public class Queue { + + private final Kit kit; + private final boolean ranked; + private final long startTime; + + @Setter + private int minElo; + + @Setter + private int maxElo; +} diff --git a/src/main/java/me/abhi/practice/task/EnderpearlTask.java b/src/main/java/me/abhi/practice/task/EnderpearlTask.java new file mode 100644 index 0000000..f4c8a31 --- /dev/null +++ b/src/main/java/me/abhi/practice/task/EnderpearlTask.java @@ -0,0 +1,38 @@ +package me.abhi.practice.task; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.concurrent.TimeUnit; + +@AllArgsConstructor +public class EnderpearlTask extends BukkitRunnable { + + private final PracticePlugin plugin; + + @Override + public void run() { + this.plugin.getServer().getOnlinePlayers().stream().forEach(p -> { + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(p); + + if (practiceProfile.getLastEnderpearl() != 0) { + + int difference = 16 - (int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - practiceProfile.getLastEnderpearl()); + p.setLevel(difference); + + p.setExp(p.getExp() - 0.003125f); + + if (System.currentTimeMillis() >= practiceProfile.getLastEnderpearl() + 16000) { + practiceProfile.setLastEnderpearl(0); + + p.setLevel(0); + p.setExp(0f); + p.sendMessage(Messages.MAY_PEARL_AGAIN.getMessage()); + } + } + }); + } +} diff --git a/src/main/java/me/abhi/practice/task/InventoryTask.java b/src/main/java/me/abhi/practice/task/InventoryTask.java new file mode 100644 index 0000000..6e12058 --- /dev/null +++ b/src/main/java/me/abhi/practice/task/InventoryTask.java @@ -0,0 +1,181 @@ +package me.abhi.practice.task; + +import com.mongodb.client.MongoCursor; +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.kit.Kit; +import me.abhi.practice.player.LeaderboardPlayer; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Menus; +import me.abhi.practice.util.misc.ItemBuilder; +import org.bson.Document; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; + +@SuppressWarnings("Duplicates") +@AllArgsConstructor +public class InventoryTask extends BukkitRunnable { + + private final PracticePlugin plugin; + + @Override + public void run() { + + this.plugin.getManagerHandler().getKitManager().getKitsList().stream().filter(k -> k.isUnranked()).forEach(k -> { + + List lore = new ArrayList<>(); + for (String itemLore : Menus.UNRANKED.getItemLore()) { + lore.add(itemLore.replace("%queue%", String.valueOf(k.getUnrankedQueue().size())).replace("%rankedMatch%", String.valueOf(k.getRankedMatch().size())).replace("%rankedQueue%", String.valueOf(k.getRankedQueue().size())).replace("%match%", String.valueOf(k.getUnrankedMatch().size())).replace("%kit%", k.getName())); + } + Menus.UNRANKED.getInventory().setItem(getUnrankedIndex(k), new ItemBuilder(k.getDisplay().getType(), k.getUnrankedMatch().size()).setDurability(k.getDisplay().getDurability()).setName(Menus.UNRANKED.getItemPrefix() + k.getName()).setLore(lore).toItemStack()); + + }); + + this.plugin.getManagerHandler().getKitManager().getKitsList().stream().filter(k -> k.isRanked()).forEach(k -> { + + if (k.isUnranked()) { + List lore = new ArrayList<>(); + for (String itemLore : Menus.RANKED.getItemLore()) { + lore.add(itemLore.replace("%queue%", String.valueOf(k.getRankedQueue().size())).replace("%unrankedMatch%", String.valueOf(k.getUnrankedMatch().size())).replace("%unrankedQueue%", String.valueOf(k.getUnrankedQueue().size())).replace("%match%", String.valueOf(k.getRankedMatch().size())).replace("%kit%", k.getName())); + } + this.plugin.getManagerHandler().getKitManager().getKitsList().indexOf(k); + Menus.RANKED.getInventory().setItem(getRankedIndex(k), new ItemBuilder(k.getDisplay().getType(), k.getRankedMatch().size()).setDurability(k.getDisplay().getDurability()).setName(Menus.RANKED.getItemPrefix() + k.getName()).setLore(lore).toItemStack()); + } + + }); + + this.plugin.getManagerHandler().getKitManager().getKitsList().stream().filter(k -> k.isEditable()).forEach(k -> { + + List lore = new ArrayList<>(); + for (String itemLore : Menus.EDITKIT.getItemLore()) { + lore.add(itemLore.replace("%kit%", k.getName())); + } + Menus.EDITKIT.getInventory().setItem(getEditIndex(k), new ItemBuilder(k.getDisplay().getType(), 1).setDurability(k.getDisplay().getDurability()).setName(Menus.EDITKIT.getItemPrefix() + k.getName()).setLore(lore).toItemStack()); + }); + + this.plugin.getManagerHandler().getKitManager().getKitsList().stream().forEach(k -> { + + List lore = new ArrayList<>(); + for (String itemLore : Menus.PARTYFFA.getItemLore()) { + lore.add(itemLore.replace("%kit%", k.getName())); + } + Menus.PARTYFFA.getInventory().setItem(this.plugin.getManagerHandler().getKitManager().getKitsList().indexOf(k), new ItemBuilder(k.getDisplay().getType(), 1).setDurability(k.getDisplay().getDurability()).setName(Menus.PARTYFFA.getItemPrefix() + k.getName()).setLore(lore).toItemStack()); + }); + + this.plugin.getManagerHandler().getKitManager().getKitsList().stream().forEach(k -> { + + List lore = new ArrayList<>(); + for (String itemLore : Menus.PARTYSPLIT.getItemLore()) { + lore.add(itemLore.replace("%kit%", k.getName())); + } + Menus.PARTYSPLIT.getInventory().setItem(this.plugin.getManagerHandler().getKitManager().getKitsList().indexOf(k), new ItemBuilder(k.getDisplay().getType(), 1).setDurability(k.getDisplay().getDurability()).setName(Menus.PARTYSPLIT.getItemPrefix() + k.getName()).setLore(lore).toItemStack()); + }); + + this.plugin.getManagerHandler().getKitManager().getKitsList().stream().forEach(k -> { + + List lore = new ArrayList<>(); + for (String itemLore : Menus.DUEL.getItemLore()) { + lore.add(itemLore.replace("%kit%", k.getName())); + } + Menus.DUEL.getInventory().setItem(this.plugin.getManagerHandler().getKitManager().getKitsList().indexOf(k), new ItemBuilder(k.getDisplay().getType(), 1).setDurability(k.getDisplay().getDurability()).setName(Menus.DUEL.getItemPrefix() + k.getName()).setLore(lore).toItemStack()); + }); + + this.plugin.getManagerHandler().getKitManager().getKitsList().stream().forEach(k -> { + + List lore = new ArrayList<>(); + for (String itemLore : Menus.TOURNAMENT.getItemLore()) { + lore.add(itemLore.replace("%kit%", k.getName())); + } + Menus.TOURNAMENT.getInventory().setItem(this.plugin.getManagerHandler().getKitManager().getKitsList().indexOf(k), new ItemBuilder(k.getDisplay().getType(), 1).setDurability(k.getDisplay().getDurability()).setName(Menus.TOURNAMENT.getItemPrefix() + k.getName()).setLore(lore).toItemStack()); + }); + + updateLeaderboards(); + } + + public int getUnrankedIndex(Kit kit) { + int i = -1; + for (Kit k : this.plugin.getManagerHandler().getKitManager().getKitsList()) { + if (k.isUnranked()) { + i += 1; + if (k == kit) { + return i; + } + } + } + return 100; + } + + public int getRankedIndex(Kit kit) { + int i = -1; + for (Kit k : this.plugin.getManagerHandler().getKitManager().getKitsList()) { + if (k.isRanked()) { + i += 1; + if (k == kit) { + return i; + } + } + } + return 100; + } + + public int getEditIndex(Kit kit) { + int i = -1; + for (Kit k : this.plugin.getManagerHandler().getKitManager().getKitsList()) { + if (k.isEditable()) { + i += 1; + if (k == kit) { + return i; + } + } + } + return 100; + } + + private void updateLeaderboards() { + if (!this.plugin.getManagerHandler().getSettingsManager().isLeaderboardsGUI()) { + return; + } + for (Kit kit : this.plugin.getManagerHandler().getKitManager().getKitsList()) { + if (!kit.isRanked()) { + continue; + } + List leaderboardPlayers = new ArrayList<>(); + + this.plugin.getServer().getOnlinePlayers().forEach(p -> { + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(p); + + leaderboardPlayers.add(new LeaderboardPlayer(p.getName(), practiceProfile.getElo(kit))); + }); + + + MongoCursor practiceDocuments = this.plugin.getManagerHandler().getMongoManager().getMongoDatabase().getCollection(kit.getName()).find().iterator(); + + while (practiceDocuments.hasNext()) { + Document playerDocument = practiceDocuments.next(); + UUID uuid = UUID.fromString(playerDocument.getString("uuid")); + + if (this.plugin.getServer().getPlayer(uuid) == null) { + String username = playerDocument.getString("username"); + int elo = playerDocument.getInteger("elo"); + + leaderboardPlayers.add(new LeaderboardPlayer(username, elo)); + } + } + int start = 0; + int end = 9; + + leaderboardPlayers.sort(Comparator.comparing(LeaderboardPlayer::getElo)); + Collections.reverse(leaderboardPlayers); + List lore = new ArrayList<>(); + for (int i = start; i <= end; i++) { + if (i < leaderboardPlayers.size()) { + LeaderboardPlayer leaderboardPlayer = leaderboardPlayers.get(i); + + lore.add(this.plugin.getConfig().getString("leaderboards-lore").replace("%pos%", String.valueOf(i + 1)).replace("%player%", leaderboardPlayer.getName()).replace("%elo%", String.valueOf(leaderboardPlayer.getElo()))); + } + } + Menus.LEADERBOARDS.getInventory().setItem(getRankedIndex(kit), new ItemBuilder(kit.getDisplay()).setName(Menus.LEADERBOARDS.getItemPrefix() + kit.getName()).setLore(lore).toItemStack()); + } + } +} diff --git a/src/main/java/me/abhi/practice/task/MongoTask.java b/src/main/java/me/abhi/practice/task/MongoTask.java new file mode 100644 index 0000000..e2fa450 --- /dev/null +++ b/src/main/java/me/abhi/practice/task/MongoTask.java @@ -0,0 +1,16 @@ +package me.abhi.practice.task; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import org.bukkit.scheduler.BukkitRunnable; + +@AllArgsConstructor +public class MongoTask extends BukkitRunnable { + + private final PracticePlugin plugin; + + @Override + public void run() { + this.plugin.getServer().getOnlinePlayers().forEach(this.plugin.getManagerHandler().getPlayerManager()::save); + } +} diff --git a/src/main/java/me/abhi/practice/task/ScoreboardTask.java b/src/main/java/me/abhi/practice/task/ScoreboardTask.java new file mode 100644 index 0000000..7df0d0a --- /dev/null +++ b/src/main/java/me/abhi/practice/task/ScoreboardTask.java @@ -0,0 +1,16 @@ +package me.abhi.practice.task; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import org.bukkit.scheduler.BukkitRunnable; + +@AllArgsConstructor +public class ScoreboardTask extends BukkitRunnable { + + private final PracticePlugin plugin; + + @Override + public void run() { + this.plugin.getServer().getOnlinePlayers().stream().forEach(this.plugin.getManagerHandler().getScoreboardManager()::update); + } +} diff --git a/src/main/java/me/abhi/practice/task/WorldTask.java b/src/main/java/me/abhi/practice/task/WorldTask.java new file mode 100644 index 0000000..f64d973 --- /dev/null +++ b/src/main/java/me/abhi/practice/task/WorldTask.java @@ -0,0 +1,16 @@ +package me.abhi.practice.task; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import org.bukkit.scheduler.BukkitRunnable; + +@AllArgsConstructor +public class WorldTask extends BukkitRunnable { + + private final PracticePlugin plugin; + + @Override + public void run() { + this.plugin.getServer().getWorlds().stream().forEach(w -> w.setStorm(false)); + } +} diff --git a/src/main/java/me/abhi/practice/task/player/ArcherMarkTask.java b/src/main/java/me/abhi/practice/task/player/ArcherMarkTask.java new file mode 100644 index 0000000..b88d151 --- /dev/null +++ b/src/main/java/me/abhi/practice/task/player/ArcherMarkTask.java @@ -0,0 +1,29 @@ +package me.abhi.practice.task.player; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.scheduler.BukkitRunnable; + +@AllArgsConstructor +public class ArcherMarkTask extends BukkitRunnable { + + private final PracticePlugin plugin; + + @Override + public void run() { + this.plugin.getServer().getOnlinePlayers().stream().forEach(p -> { + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(p); + + if (practiceProfile.getLastArcherMark() != 0) { + + if (System.currentTimeMillis() >= practiceProfile.getLastArcherMark() + 15000) { + practiceProfile.setLastArcherMark(0); + + p.sendMessage(Messages.NO_LONGER_ARCHER_MARKED.getMessage()); + } + } + }); + } +} diff --git a/src/main/java/me/abhi/practice/task/player/BardTask.java b/src/main/java/me/abhi/practice/task/player/BardTask.java new file mode 100644 index 0000000..d4449ac --- /dev/null +++ b/src/main/java/me/abhi/practice/task/player/BardTask.java @@ -0,0 +1,65 @@ +package me.abhi.practice.task.player; + +import lombok.RequiredArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.event.impl.BardHoldItemEvent; +import me.abhi.practice.event.impl.BardTaskUpdateEvent; +import me.abhi.practice.kit.hcf.HCFKit; +import me.abhi.practice.kit.hcf.data.bard.BardData; +import me.abhi.practice.kit.hcf.data.bard.BardItem; +import me.abhi.practice.match.Match; +import me.abhi.practice.party.Party; +import me.abhi.practice.party.PartyState; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +@RequiredArgsConstructor +public class BardTask extends BukkitRunnable { + + private final PracticePlugin plugin; + private final Player player; + private int i; + private BardData bardData = new BardData(); + + @Override + public void run() { + if (!player.isOnline()) { + this.cancel(); + return; + } + + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(player); + + i += 1; + + if (i % 10 == 0) { + practiceProfile.setBardEnergy(practiceProfile.getBardEnergy() + 1 >= 100 ? 100 : practiceProfile.getBardEnergy() + 1); + } + + BardItem bardItem = bardData.getBardItemList().stream().filter(b -> player.getItemInHand().getType() == b.getMaterial()).findFirst().orElse(null); + + if (bardItem != null) { + new BardHoldItemEvent(player, bardItem).call(); + } + + new BardTaskUpdateEvent(player).call(); + + if (practiceProfile.getPlayerState() != PlayerState.PARTY) { + this.cancel(); + return; + } + + Party party = practiceProfile.getParty(); + if (party.getPartyState() != PartyState.MATCH) { + this.cancel(); + return; + } + Match match = party.getMatch(); + if (match.getKit() != null || practiceProfile.getHcfKit() != HCFKit.BARD || match.getDead().contains(player.getUniqueId())) { + this.cancel(); + return; + } + } +} diff --git a/src/main/java/me/abhi/practice/task/player/RogueBackstabTask.java b/src/main/java/me/abhi/practice/task/player/RogueBackstabTask.java new file mode 100644 index 0000000..dabcd18 --- /dev/null +++ b/src/main/java/me/abhi/practice/task/player/RogueBackstabTask.java @@ -0,0 +1,29 @@ +package me.abhi.practice.task.player; + +import lombok.AllArgsConstructor; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.scheduler.BukkitRunnable; + +@AllArgsConstructor +public class RogueBackstabTask extends BukkitRunnable { + + private final PracticePlugin plugin; + + @Override + public void run() { + this.plugin.getServer().getOnlinePlayers().stream().forEach(p -> { + PracticeProfile practiceProfile = this.plugin.getManagerHandler().getProfileManager().getProfile(p); + + if (practiceProfile.getLastRogueBackstab() != 0) { + + if (System.currentTimeMillis() >= practiceProfile.getLastRogueBackstab() + 6000) { + + practiceProfile.setLastRogueBackstab(0); + p.sendMessage(Messages.MAY_BACKSTAB_AGAIN.getMessage()); + } + } + }); + } +} diff --git a/src/main/java/me/abhi/practice/tournament/Tournament.java b/src/main/java/me/abhi/practice/tournament/Tournament.java new file mode 100644 index 0000000..8ab4420 --- /dev/null +++ b/src/main/java/me/abhi/practice/tournament/Tournament.java @@ -0,0 +1,106 @@ +package me.abhi.practice.tournament; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.kit.Kit; +import me.abhi.practice.match.Match; +import me.abhi.practice.player.PlayerState; +import me.abhi.practice.player.PracticeProfile; +import me.abhi.practice.util.ListUtil; +import me.abhi.practice.util.enums.Messages; +import org.bukkit.entity.Player; + +import java.util.*; + +@Setter +@Getter +@RequiredArgsConstructor +public class Tournament { + + private final PracticePlugin plugin; + private final Kit kit; + private TournamentState tournamentState = TournamentState.STARTING; + private int round = 1; + private List matchList = new ArrayList<>(); + private List participants = new ArrayList<>(); + private Random random = new Random(); + private long down; + private long startTime; + + public void startRound() { + if (participants.size() == 0) { + end(null); + return; + } + if (participants.size() == 1) { + end(this.plugin.getServer().getPlayer(participants.get(0)).getName()); + return; + } + UUID sitout = null; + if (participants.size() % 2 != 0) { + sitout = participants.get(random.nextInt(participants.size())); + } + List l1 = new ArrayList<>(participants); + List l2 = new ArrayList<>(); + if (sitout != null) { + l1.remove(sitout); + + Player player = this.plugin.getServer().getPlayer(sitout); + player.sendMessage(Messages.TOURNAMENT_SITOUT.getMessage()); + } + + Collections.shuffle(l1); + for (int i = 0; i < (l1.size() / 2); i++) { + l2.add(l1.get(i)); + l1.remove(l1.get(i)); + } + if (l2.size() != l1.size()) { + end(null); + return; + } + for (int i = 0; i < l1.size(); i++) { + if (l1.get(i) != l2.get(i)) { + Match match = new Match(this.plugin, kit, ListUtil.newList(l1.get(i)), ListUtil.newList(l2.get(i)), false, true); + matchList.add(match); + match.start(); + + Player p1 = this.plugin.getServer().getPlayer(l1.get(i)); + PracticeProfile p1p = this.plugin.getManagerHandler().getProfileManager().getProfile(p1); + + p1p.setMatch(match); + p1p.setPlayerState(PlayerState.MATCH); + kit.getUnrankedMatch().add(p1.getUniqueId()); + + Player p2 = this.plugin.getServer().getPlayer(l2.get(i)); + PracticeProfile p2p = this.plugin.getManagerHandler().getProfileManager().getProfile(p2); + + p2p.setMatch(match); + p2p.setPlayerState(PlayerState.MATCH); + kit.getUnrankedMatch().add(p2.getUniqueId()); + } + } + } + + public void end(String winner) { + this.plugin.getServer().broadcastMessage(winner != null ? Messages.TOURNAMENT_WINNER.getMessage().replace("%player%", winner).replace("%kit%", kit.getName()) : Messages.TOURNAMENT_CANCELLED.getMessage().replace("%kit%", kit.getName())); + + participants.forEach(u -> { + Player player = PracticePlugin.getInstance().getServer().getPlayer(u); + + PracticeProfile practiceProfile = PracticePlugin.getInstance().getManagerHandler().getProfileManager().getProfile(player); + practiceProfile.setPlayerState(PlayerState.LOBBY); + practiceProfile.setTournament(null); + + this.plugin.getManagerHandler().getPlayerManager().giveItems(player, true); + this.plugin.getManagerHandler().getPlayerManager().teleportSpawn(player); + }); + + this.plugin.getManagerHandler().getTournamentManager().setTournament(null); + } + + public void broadcast(String message) { + participants.forEach(u -> this.plugin.getServer().getPlayer(u).sendMessage(message)); + } +} diff --git a/src/main/java/me/abhi/practice/tournament/TournamentState.java b/src/main/java/me/abhi/practice/tournament/TournamentState.java new file mode 100644 index 0000000..da14d8a --- /dev/null +++ b/src/main/java/me/abhi/practice/tournament/TournamentState.java @@ -0,0 +1,6 @@ +package me.abhi.practice.tournament; + +public enum TournamentState { + + STARTING, STARTED, WAITING +} diff --git a/src/main/java/me/abhi/practice/util/DurationUtil.java b/src/main/java/me/abhi/practice/util/DurationUtil.java new file mode 100644 index 0000000..527ed0f --- /dev/null +++ b/src/main/java/me/abhi/practice/util/DurationUtil.java @@ -0,0 +1,46 @@ +package me.abhi.practice.util; + +import java.text.DecimalFormat; +import java.util.concurrent.TimeUnit; + +@SuppressWarnings("Duplicates") +public class DurationUtil { + + private static DecimalFormat decimalFormat = new DecimalFormat("00"); + + public static String getDuration(long startTime) { + int difference = (int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - startTime); + + int h = difference / 3600; + int s = difference % 60; + int m = difference / 60 % 60; + + return (startTime > 0) ? (h > 0 ? decimalFormat.format(h) + ":" : "") + decimalFormat.format(m) + ":" + decimalFormat.format(s) : "00:00"; + } + + public static String getDuration(long startTime, long endTime) { + int difference = (int) TimeUnit.MILLISECONDS.toSeconds(endTime - startTime); + + int h = difference / 3600; + int s = difference % 60; + int m = difference / 60 % 60; + + return (startTime > 0) ? (h > 0 ? decimalFormat.format(h) + ":" : "") + decimalFormat.format(m) + ":" + decimalFormat.format(s) : "00:00"; + } + + public static String getDurationDown(long start, int i) { + long time = i - (TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start)); + + long seconds = time % 60; + long minutes = time / 60 % 60; + long hours = (time / 60) / 60; + DecimalFormat decimalFormat = new DecimalFormat("00"); + + String toReturn = decimalFormat.format(minutes) + ":" + decimalFormat.format(seconds); + + if (hours > 0) { + toReturn = decimalFormat.format(hours) + ":" + toReturn; + } + return toReturn; + } +} diff --git a/src/main/java/me/abhi/practice/util/EloUtil.java b/src/main/java/me/abhi/practice/util/EloUtil.java new file mode 100644 index 0000000..8aa18fb --- /dev/null +++ b/src/main/java/me/abhi/practice/util/EloUtil.java @@ -0,0 +1,35 @@ +package me.abhi.practice.util; + +public class EloUtil { + + private static double[] getEstimations(double rankingA, double rankingB) { + double[] ret = new double[2]; + double estA = 1.0 / (1.0 + Math.pow(10.0, (rankingB - rankingA) / 400.0)); + double estB = 1.0 / (1.0 + Math.pow(10.0, (rankingA - rankingB) / 400.0)); + ret[0] = estA; + ret[1] = estB; + return ret; + } + + private static int getConstant(int ranking) { + if (ranking < 1400) { + return 32; + } + if (ranking >= 1400 && ranking < 1800) { + return 24; + } + if (ranking >= 1800 && ranking < 2400) { + return 16; + } + return 0; + } + + public static int[] getNewRankings(int rankingA, int rankingB, boolean victoryA) { + int[] elo = new int[2]; + double[] estimates = getEstimations(rankingA, rankingB); + int newRankA = (int) (rankingA + getConstant(rankingA) * ((victoryA ? 1 : 0) - estimates[0])); + elo[0] = Math.round((float) newRankA); + elo[1] = Math.round((float) (rankingB - (newRankA - rankingA))); + return elo; + } +} diff --git a/src/main/java/me/abhi/practice/util/InventoryUtil.java b/src/main/java/me/abhi/practice/util/InventoryUtil.java new file mode 100644 index 0000000..52df41f --- /dev/null +++ b/src/main/java/me/abhi/practice/util/InventoryUtil.java @@ -0,0 +1,168 @@ +package me.abhi.practice.util; + +import org.bukkit.Bukkit; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.util.io.BukkitObjectInputStream; +import org.bukkit.util.io.BukkitObjectOutputStream; +import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +public class InventoryUtil { + /** + * Converts the player inventory to a String array of Base64 strings. First string is the content and second string is the armor. + * + * @param playerInventory to turn into an array of strings. + * @return Array of strings: [ main content, armor content ] + * @throws IllegalStateException + */ + public static String[] playerInventoryToBase64(PlayerInventory playerInventory) throws IllegalStateException { + //get the main content part, this doesn't return the armor + String content = toBase64(playerInventory); + String armor = itemStackArrayToBase64(playerInventory.getArmorContents()); + + return new String[]{content, armor}; + } + + /** + * A method to serialize an {@link ItemStack} array to Base64 String. + *

+ *

+ *

+ * Based off of {@link #toBase64(Inventory)}. + * + * @param items to turn into a Base64 String. + * @return Base64 string of the items. + * @throws IllegalStateException + */ + public static String itemStackArrayToBase64(ItemStack[] items) throws IllegalStateException { + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream); + + // Write the size of the inventory + dataOutput.writeInt(items.length); + + // Save every element in the list + for (int i = 0; i < items.length; i++) { + dataOutput.writeObject(items[i]); + } + + // Serialize that array + dataOutput.close(); + return Base64Coder.encodeLines(outputStream.toByteArray()); + } catch (Exception e) { + throw new IllegalStateException("Unable to save item stacks.", e); + } + } + + /** + * A method to serialize an inventory to Base64 string. + *

+ *

+ *

+ * Special thanks to Comphenix in the Bukkit forums or also known + * as aadnk on GitHub. + * + * Original Source + * + * @param inventory to serialize + * @return Base64 string of the provided inventory + * @throws IllegalStateException + */ + public static String toBase64(Inventory inventory) throws IllegalStateException { + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream); + + // Write the size of the inventory + dataOutput.writeInt(inventory.getSize()); + + // Save every element in the list + for (int i = 0; i < inventory.getSize(); i++) { + dataOutput.writeObject(inventory.getItem(i)); + } + + // Serialize that array + dataOutput.close(); + return Base64Coder.encodeLines(outputStream.toByteArray()); + } catch (Exception e) { + throw new IllegalStateException("Unable to save item stacks.", e); + } + } + + /** + * A method to get an {@link Inventory} from an encoded, Base64, string. + *

+ *

+ *

+ * Special thanks to Comphenix in the Bukkit forums or also known + * as aadnk on GitHub. + * + * Original Source + * + * @param data Base64 string of data containing an inventory. + * @return Inventory created from the Base64 string. + * @throws IOException + */ + public static Inventory fromBase64(String data) { + try { + ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data)); + BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream); + Inventory inventory = Bukkit.getServer().createInventory(null, dataInput.readInt()); + + // Read the serialized inventory + for (int i = 0; i < inventory.getSize(); i++) { + inventory.setItem(i, (ItemStack) dataInput.readObject()); + } + + dataInput.close(); + return inventory; + } catch (Exception e) { + } + return null; + } + + /** + * Gets an array of ItemStacks from Base64 string. + *

+ *

+ *

+ * Base off of {@link #fromBase64(String)}. + * + * @param data Base64 string to convert to ItemStack array. + * @return ItemStack array created from the Base64 string. + * @throws IOException + */ + public static ItemStack[] itemStackArrayFromBase64(String data) { + try { + ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data)); + BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream); + ItemStack[] items = new ItemStack[dataInput.readInt()]; + + // Read the serialized inventory + for (int i = 0; i < items.length; i++) { + items[i] = (ItemStack) dataInput.readObject(); + } + + dataInput.close(); + return items; + } catch (Exception ex) { + } + return null; + } + + public static Inventory cloneInventory(Inventory inventory) { + Inventory clone = Bukkit.createInventory(null, inventory.getSize(), inventory.getName()); + clone.setContents(inventory.getContents()); + return clone; + } + + public static ItemStack[] cloneArmor(ItemStack[] armor) { + return armor.clone(); + } +} diff --git a/src/main/java/me/abhi/practice/util/ListUtil.java b/src/main/java/me/abhi/practice/util/ListUtil.java new file mode 100644 index 0000000..cd59236 --- /dev/null +++ b/src/main/java/me/abhi/practice/util/ListUtil.java @@ -0,0 +1,15 @@ +package me.abhi.practice.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +public class ListUtil { + + public static List newList(UUID... uuids) { + List toReturn = new ArrayList<>(); + Arrays.stream(uuids).forEach(u -> toReturn.add(u)); + return toReturn; + } +} diff --git a/src/main/java/me/abhi/practice/util/LocationUtil.java b/src/main/java/me/abhi/practice/util/LocationUtil.java new file mode 100644 index 0000000..0741bf7 --- /dev/null +++ b/src/main/java/me/abhi/practice/util/LocationUtil.java @@ -0,0 +1,60 @@ +package me.abhi.practice.util; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; + +public class LocationUtil { + + public static String getStringFromLocation(Location loc) { + if (loc == null) { + return ""; + } + return loc.getWorld().getName() + ":" + loc.getX() + ":" + loc.getY() + ":" + loc.getZ() + ":" + loc.getYaw() + ":" + loc.getPitch(); + } + + public static Location getLocationFromString(String s) { + if (s == null || s.trim() == "") { + return null; + } + String[] parts = s.split(":"); + if (parts.length == 6) { + World w = Bukkit.getServer().getWorld(parts[0]); + double x = Double.parseDouble(parts[1]); + double y = Double.parseDouble(parts[2]); + double z = Double.parseDouble(parts[3]); + float yaw = Float.parseFloat(parts[4]); + float pitch = Float.parseFloat(parts[5]); + return new Location(w, x, y, z, yaw, pitch); + } + return null; + } + + public static String getLiteStringFromLocation(Location loc) { + if (loc == null) { + return ""; + } + return loc.getWorld().getName() + ":" + loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ(); + } + + public static Location getLiteLocationFromString(String s) { + if (s == null || s.trim() == "") { + return null; + } + String[] parts = s.split(":"); + if (parts.length == 4) { + World w = Bukkit.getServer().getWorld(parts[0]); + double x = Double.parseDouble(parts[1]); + double y = Double.parseDouble(parts[2]); + double z = Double.parseDouble(parts[3]); + return new Location(w, x, y, z); + } + return null; + } + + public static Location getSpawn(Location s1, Location s2) { + Location spawn = s1.clone(); + spawn.setYaw(s1.toVector().angle(s2.toVector())); + return spawn; + } +} \ No newline at end of file diff --git a/src/main/java/me/abhi/practice/util/enums/Items.java b/src/main/java/me/abhi/practice/util/enums/Items.java new file mode 100644 index 0000000..45443c0 --- /dev/null +++ b/src/main/java/me/abhi/practice/util/enums/Items.java @@ -0,0 +1,34 @@ +package me.abhi.practice.util.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.inventory.ItemStack; + +@Getter +@AllArgsConstructor +public enum Items { + + UNRANKED(null, 0), + RANKED(null, 0), + PARTY(null, 0), + EDITKIT(null, 0), + LEAVE_QUEUE(null, 0), + CUSTOM_KIT(null, 0), + DEFAULT_KIT(null, 0), + PARTY_EVENTS(null, 0), + HCF_SELECTOR(null, 0), + LEADER_PARTY_INFO(null, 0), + PLAYER_PARTY_INFO(null, 0), + DISBAND_PARTY(null, 0), + LEAVE_PARTY(null, 0), + LEAVE_EVENT(null, 0), + LEAVE_TOURNAMENT(null, 0), + STOP_SPECTATING(null, 0); + + @Setter + private ItemStack item; + + @Setter + private int slot; +} diff --git a/src/main/java/me/abhi/practice/util/enums/Menus.java b/src/main/java/me/abhi/practice/util/enums/Menus.java new file mode 100644 index 0000000..7482e4f --- /dev/null +++ b/src/main/java/me/abhi/practice/util/enums/Menus.java @@ -0,0 +1,33 @@ +package me.abhi.practice.util.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.inventory.Inventory; + +import java.util.List; + +@Getter +@AllArgsConstructor +public enum Menus { + + UNRANKED(null, null, null), + RANKED(null, null, null), + EDITKIT(null, null, null), + PARTYFFA(null, null, null), + PARTYSPLIT(null, null, null), + DUEL(null, null, null), + TOURNAMENT(null, null, null), + LEADERBOARDS(null, null, null), + SETTINGS(null, null, null); + + @Setter + private Inventory inventory; + + @Setter + private String itemPrefix; + + @Setter + private List itemLore; + +} diff --git a/src/main/java/me/abhi/practice/util/enums/Messages.java b/src/main/java/me/abhi/practice/util/enums/Messages.java new file mode 100644 index 0000000..341709b --- /dev/null +++ b/src/main/java/me/abhi/practice/util/enums/Messages.java @@ -0,0 +1,204 @@ +package me.abhi.practice.util.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.util.misc.CC; + +@Getter +@AllArgsConstructor +public enum Messages { + + SPAWN_SET("&aYou have successfully set the spawn."), + EDITOR_SET("&aYou have successfully set the editor."), + KIT_ALREADY_EXISTS("&cThat kit already exists."), + KIT_DOESNT_EXIST("&cThat kit doesn't exist."), + KIT_CREATED("&eYou have created the kit &a%kit%&e."), + KIT_DELETED("&eYou have deleted the kit &a%kit%&e."), + LOADED_KIT("&eYou have loaded the kit &a%kit%&e."), + KIT_NOT_SET("&cYou don't have an inventory set for that kit."), + HAND_CANT_BE_AIR("&cYour hand may not be air."), + KIT_DISPLAY_SET("&eYou have updated the display of kit &a%kit%&e."), + KIT_INVENTORY_SET("&eYou have set the inventory for the kit &a%kit%&e."), + KIT_EDITCHEST_UPDATED("&eYou have updated the edit chest of kit &a%kit% &eto &a%value%&e."), + KIT_TYPE_DOESNT_EXIST("&cThat kit type doesn't exist."), + KIT_TYPE_UPDATED("&eYou have updated the type of kit &a%kit%&e to &a%type%&e."), + KIT_TICKS_UPDATED("&eYou have updated the type of kit &a%kit%&e to &a%ticks%&e."), + KIT_EDITINV_UPDATED("&eYou have set the edit inventory for the kit &a%kit%&e."), + KIT_RANKED_UPDATED("&eYou have updated ranked of kit &a%kit% &eto &a%value%&e."), + KIT_UNRANKED_UPDATED("&eYou have updated unranked of kit &a%kit% &eto &a%value%&e."), + KIT_EDITABLE_UPDATED("&eYou have updated editable of kit &a%kit% &eto &a%value%&e."), + KIT_ISNT_RANKED("&cThat kit isn't ranked."), + JOINED_UNRANKED_QUEUE("&aYou are now queued for Unranked %kit%."), + JOINED_RANKED_QUEUE("&aYou are now queued for Ranked %kit%."), + UNRANKED_MATCH_FOUND("&e&lMatch found! &eOpponent: &b%player%"), + RANKED_MATCH_FOUND("&e&lMatch found! &eOpponent: &b%player% (%elo% Elo)"), + MATCH_STARTING("&e%time%..."), + MATCH_STARTED("&aMatch started."), + LEFT_QUEUE("&cYou have left the queue for %queueType% %kit%."), + ARENA_ALREADY_EXISTS("&cThat arena already exists."), + ARENA_CREATED("&eYou have created the arena &a%arena%&e."), + ARENA_DOESNT_EXIST("&cThat arena doesn't exist."), + ARENA_DELETED("&eYou have deleted the arena &a%arena%&e."), + ARENA_FIRST_SET("&eYou set the first location for arena &a%arena%&e."), + ARENA_SECOND_SET("&eYou set the second location for arena &a%arena%&e."), + ARENA_TYPE_UPDATED("&eYou have updated the type of arena &a%arena%&e to &a%type%&e."), + INVALID_STATE("&cYou cannot do this in your current state."), + TELEPORTING_TO_SPAWN("&eTeleporting you to spawn..."), + PLAYER_DEATH_KILLED("&c%player% &7was killed by &a%killer%&7."), + PLAYER_DEATH_DIED("&c%player% &7died."), + PLAYER_DEATH_DISCONNECTED("&c%player% &7disconnected."), + PLAYER_DEATH_LEFT("&c%player% &7left."), + MATCH_END("&6Post-match inventories &7(Click to view):\n\n&6Winner: &a%winnerNames%\n&6Loser: &c%loserNames%"), + ELO_CHANGES("&eElo changes: &a%winner% +%eloDifference% (%newWinnerElo%) &c%loser% -%eloDifference% (%newLoserElo%)"), + INVENTORY_HOVER("Click here to view %player%'s inventory."), + MAY_PEARL_AGAIN("&aYou may pearl again!"), + MUST_WAIT_TO_PEARL("&cYou must wait %time%s to do that again!"), + INVENTORY_NOT_FOUND("&cThere was no inventory found for that player."), + SAVED_CUSTOM_KIT("&eSaved custom kit &a%kit% #%number%&e."), + DELETED_CUSTOM_KIT("&eDeleted custom kit &a%kit% #%number%&e."), + EQUIPPED_CUSTOM_KIT("&eEquipped custom kit &r%name%&e."), + EQUIPPED_DEFAULT_KIT("&eEquipped default kit for %kit%."), + LOADED_CUSTOM_KIT("&eLoaded custom kit for %kit% &a#%number%."), + SET_CUSTOM_NAME("&eType your kit name in chat (color codes are applicable)"), + CUSTOM_NAME_SET("&eCustom name for %kit% &a#%number% to &r%name%&e."), + PARTY_HELP("&8&m--------------------------------------\n&d&lParty Help\n&8&m--------------------------------------\n&d/party create - Create a party\n/party invite - Invite a player to your party\n/party join - Join a player's party\n/party leave - Leave your party\n/party kick - Kick a player from your party\n/party open - Open your party\n/party promote - Transfer leadership of party\n/party disband - Disband party\n/party info - View party details\n \nUse '&6@&d' &dto type in party chat\n&8&m--------------------------------------"), + MUST_BE_IN_LOBBY("&cYou must be in the lobby to do this."), + CREATED_PARTY("&eYou have created a party!"), + NOT_IN_PARTY("&cYou are not in a party."), + MUST_BE_PARTY_LEADER("&cYou must be the party leader to do this."), + PARTY_DISBANDED("&cYour party has been disbanded."), + COULD_NOT_FIND_PLAYER("&cCould not find player with the name %player%."), + EXISTING_PARTY_INVITE("&cYou already have an existing party invite out to that player."), + PARTY_INVITE_SENT("&a%player% &ehas been invited to the party."), + PARTY_INVITE("&a%player% &ehas invited you to their party (&a%amount%&e) &a[Accept]"), + PARTY_INVITE_HOVER("Click here to join %player%'s party."), + PLAYER_NOT_IN_PARTY("&c%player% is not in a party."), + PLAYERS_PARTY_NOT_IN_LOBBY("&c%player%'s party is not in the lobby."), + PARTY_INVITE_NOT_FOUND("&cYou do not have an invite from that party."), + PLAYER_JOINED_PARTY("&a%player% &ehas joined the party."), + LEADER_CANT_LEAVE("&cYou are the party leader. To leave the party, you must promote someone else or disband the party."), + PLAYER_LEFT_PARTY("&a%player% &ehas left the party."), + LEFT_PARTY("&cYou have left the party."), + PLAYER_NOT_IN_LOBBY("&c%player% is not in the lobby."), + PLAYER_NOT_IN_YOUR_PARTY("&c%player% is not in your party."), + PARTY_FULL("&cThat party is full."), + PARTY_OPENED("&eThe party has been &aopened&e."), + PARTY_CLOSED("&eThe party has been &cclosed&e."), + PLAYER_PROMOTED("&a%player% &ehas been promoted to party leader."), + CANT_PROMOTE_YOURSELF("&aYou can't promote yourself!"), + PARTY_INFO("&8&m--------------------------------------\n&6Leader: &e%leader%\n&6Members (&e%amount%&6): &e%members%\n&6Status: &e%status%\n&8&m--------------------------------------"), + PROVIDE_A_MESSAGE("&cPlease provide a message."), + PARTY_FFA_STARTING("&eParty ffa starting..."), + FEATURE_DISABLED("&cThis feature is currently disabled."), + MUST_NEED_TWO_MEMBERS("&cYou need at least 2 players in your party to do this."), + TIME_SET_DAY("&aTime set to day."), + TIME_SET_SUNSET("&aTime set to sunset."), + TIME_SET_NIGHT("&aTime set to night."), + DUEL_REQUEST_EXISTS("&cYou already have an existing duel request to that player."), + CANT_DUEL_YOURSELF("&cYou can't duel yourself!"), + PARTY_DOESNT_EXIST("&cThat party no longer exists."), + PARTY_NOT_IN_LOBBY("&cThat party is not in the lobby."), + SENT_PARTY_DUEL("&eSent a duel request to &a%player%'s Party &ewith the kit &a%kit%&e."), + PARTY_DUEL_REQUEST("&a%player%'s Party &e(&a%amount%&e) has sent you a duel request with the kit &a%kit% [Accept]"), + PARTY_DUEL_HOVER("Click here to accept %player%'s party duel request."), + SENT_DUEL("&eSent a duel request to &a%player% &ewith the kit &a%kit%&e."), + DUEL_REQUEST("&a%player% &ehas sent you a duel request with the kit &a%kit% [Accept]"), + DUEL_HOVER("Click here to accept %player%'s duel request."), + PLAYER_DISABLED_DUELS("&c%player% has duel requests disabled."), + MUST_CREATE_PARTY_TO_DUEL("&cYou must create a party to duel %player%'s party."), + INVALID_PAGE_NUMBER("&cInvalid page number."), + LEADERBOARDS_PAGE_DOESNT_EXIST("&cThat page doesn't exist."), + LEADERBOARDS_HEADER("&a%kit% &eleaderboards page &a%page%"), + LEADERBOARDS_PLAYER("&a#%place%&e. &a%player% &e(&a%elo%&e)"), + DUEL_REQUEST_NOT_FOUND("&cThat duel request was not found."), + CANT_DROP_FIRST_ITEM("&cYou can't drop the item in your first slot."), + DIAMOND_KIT_SET("&eYou have set the kit for HCF &aDiamond&e."), + ARCHER_KIT_SET("&eYou have set the kit for HCF &aArcher&e."), + BARD_KIT_SET("&eYou have set the kit for HCF &aBard&e."), + ROGUE_KIT_SET("&eYou have set the kit for HCF &aRogue&e."), + MUST_WAIT_TO_BARD_BUFF("&cYou can only buff every 6 seconds. You must wait %time%s."), + NEED_MORE_ENERGY("&cYou need %energy% energy to do this."), + ACTIVATED_BARD_BUFF("&6[&eBard&6] &eYou have activated the buff &a%buff%&e."), + MUST_WAIT_TO_ARCHER_BUFF("&cYou can only buff every 60 seconds. You must wait %time%s."), + ACTIVATED_ARCHER_BUFF("&6[&eArcher&6] &eYou have activated the buff &a%buff%&e."), + MUST_WAIT_TO_ROGUE_BUFF("&cYou can only buff every 60 seconds. You must wait %time%s."), + ACTIVATED_ROGUE_BUFF("&6[&eRogue&6] &eYou have activated the buff &a%buff%&e."), + ARCHER_TAGGED("&6[&eRogue&6] &eYou have been archer tagged for &615 &eseconds!"), + PLAYER_ARCHER_TAGGED("&6[&eArcher&6] &eYou have archer tagged &6%player% &efor &615 &eseconds!"), + NO_LONGER_ARCHER_MARKED("&6[&eArcher&6] &eYou are no longer archer tagged!"), + MUST_WAIT_TO_BACKSTAB("&cYou must wait to %time%s to backstab again."), + MAY_BACKSTAB_AGAIN("&6[&eRogue&6] &eYou may use backstab again!"), + BACKSTABBED("&6[&eRogue&6] &eYou were backstabbed by &6%player%&e."), + BACKSTABBED_PLAYER("&6[&eRogue&6] &eYou backstabbed &6%player%&e."), + EVENT_PLAYER_ELIMINATED("&c%player% &7has been eliminated."), + EVENT_HELP("&8&m--------------------------------------\n&d&lEvent Help\n&8&m--------------------------------------\n&d/event start - Start an event\n/event join - Join an event\n/event leave - Leave an event\n/event spectate - Spectate an event\n&8&m--------------------------------------"), + NO_EVENT_STARTED("&cThere is no event by that name started."), + EVENT_ALREADY_STARTED("&cThat event has already started."), + EVENT_DELAY("You must wait for the event cooldown to end before starting another one."), + EVENT_DOESNT_EXIST("&cThat event doesn't exist."), + EVENT_STARTING("&a%player% &eis hosting a &a%event% &eevent! &a[Join]"), + EVENT_HOVER("Click to join the %event% event."), + PLAYER_JOINED_EVENT("&a%player% &ehas joined the event!"), + NOT_IN_EVENT("&cYou are not in an event."), + PLAYER_LEFT_EVENT("&a%player% &ehas left the event!"), + LEFT_EVENT("&cYou have left the event."), + EVENT_WINNER("&6[&eEvent&6] &a%player% &ehas won the &a%event% &eevent!"), + EVENT_LOBBY_SET("&eThe lobby for event &a%event% &ehas been set."), + EVENT_FIRST_SET("&eThe first spawn for event &a%event% &ehas been set."), + EVENT_SECOND_SET("&eThe second spawn for event &a%event% &ehas been set."), + SUMO_EVENT_MATCHUP("&6[&eSumo&6] &eNow fighting: &a%player1% &evs. &a%player2%"), + SUMO_EVENT_MATCH_STARTING("&e%time%..."), + SUMO_EVENT_MATCH_STARTED("&aMatch started!"), + SUMO_ROUND_STARTING("&6[&eSumo&6] &eNext round starting in &a%time%..."), + SCOREBOARD_ENABLED("&6[&eScoreboard&6] &aEnabled"), + SCOREBOARD_DISABLED("&6[&eScoreboard&6] &cDisabled"), + SILENT_ENABLED("&6[&eSilent&6] &aEnabled"), + SILENT_DISABLED("&6[&eSilent&6] &cDisabled"), + BUILDER_ENABLED("&6[&eBuilder&6] &aEnabled"), + BUILDER_DISABLED("&6[&eBuilder&6] &cDisabled"), + DUEL_REQUEST_ENABLED("&6[&eDuel Requests&6] &aEnabled"), + DUEL_REQUEST_DISABLED("&6[&eDuel Requests&6] &cDisabled"), + EVENT_CANCELLED("&6[&eEvent&6] &eThe &a%event% &ehas been cancelled."), + EVENT_FULL("&cThat event is full."), + TOURNAMENT_HELP("&8&m--------------------------------------\n&d&lTournament Help\n&8&m--------------------------------------\n&d/tournament join - Join a tournament\n/tournament leave - Leave a tournament\n/tournament status - View all tournament matches\n&8&m--------------------------------------"), + TOURNAMENT_ALREADY_STARTED("&cThere is already a tournament started."), + TOURNAMENT_STARTING("&eThere is a &a%kit% &etournament starting! &a[Join]"), + TOURNAMENT_HOVER("Click to join the %kit% tournament."), + NO_TOURNAMENT_STARTED("&cThere is no tournament started."), + PLAYER_JOINED_TOURNAMENT("&a%player% &ehas joined the tournament &a(%players%/%max%)"), + PLAYER_LEFT_TOURNAMENT("&a%player% &ehas left the tournament &a(%players%/%max%)"), + PLAYER_ELIMINATED_TOURNAMENT("&a%player% &ehas been eliminated!"), + TOURNAMENT_FULL("&cThe tournament is full."), + NOT_IN_TOURNAMENT("&cYou are not in a tournament."), + LEFT_TOURNAMENT("&cYou have left the tournament."), + TOURNAMENT_WINNER("&6[&eTournament&6] &a%player% &ehas won the &a%kit% &etournament!"), + TOURNAMENT_CANCELLED("&6[&eTournament&6] &eThe &a%kit% &etournament has been cancelled."), + TOURNAMENT_SITOUT("&cWe could not find you a match. You will automatically be advanced to the next round."), + TOURNAMENT_NEXT_ROUND("&6[&eTournament&6] &eRound &a%round% &ewill start in &a30 &eseconds."), + PLAYER_NOT_IN_MATCH("&c%player% is not in a match."), + PLAYER_NOW_SPECTATING("&7* &a%player% &eis now spectating."), + PLAYER_NO_LONGER_SPECTATING("&7* &a%player% &eis no longer spectating."), + NO_LONGER_SPECTATING("&cYou are no longer spectating."), + TOURNAMENT_STATUS_HEADER("&8&m-----------------------------------"), + TOURNAMENT_STATUS_MATCH("&d%player1% vs. %player2%"), + TOURNAMENT_STATUS_FOOTER("&8&m-----------------------------------"), + TOURNAMENT_NO_FIGHTS("&cThere are no fights happening."), + NOT_HCF_ARENA("&cThat is not an HCF arena."), + PLAYER_HEALTH("&a%player%'s &ehealth is &c%health% \u2764"), + NEVER_PLAYED_BEFORE("&c%player% has never played before."), + INVALID_AMOUNT("&cInvalid amount."), + INVALID_ELO("&cThe elo amount you have entered is either too little or too big."), + SET_ELO("&eYou have set &a%player%'s &eelo for kit &a%kit% &eto &a%elo%&e."); + + private String defaultMessage; + + public String getMessage() { + return (PracticePlugin.getInstance().getManagerHandler().getConfigurationManager().getMessagesFile().get(getPath()) != null ? CC.translate(PracticePlugin.getInstance().getManagerHandler().getConfigurationManager().getMessagesFile().getString(getPath())) : CC.translate(defaultMessage)).replace("%splitter%", "โ”ƒ"); + } + + public String getPath() { + return this.toString().replace("_", "-"); + } + +} diff --git a/src/main/java/me/abhi/practice/util/misc/BlankObject.java b/src/main/java/me/abhi/practice/util/misc/BlankObject.java new file mode 100644 index 0000000..0594cd5 --- /dev/null +++ b/src/main/java/me/abhi/practice/util/misc/BlankObject.java @@ -0,0 +1,16 @@ +package me.abhi.practice.util.misc; + +public class BlankObject { + + /* + + + + + Empty class. When /togglescoreboard is disabled or /settings, this is the class that is registered instead + + + + + */ +} diff --git a/src/main/java/me/abhi/practice/util/misc/CC.java b/src/main/java/me/abhi/practice/util/misc/CC.java new file mode 100644 index 0000000..f5cf549 --- /dev/null +++ b/src/main/java/me/abhi/practice/util/misc/CC.java @@ -0,0 +1,87 @@ +package me.abhi.practice.util.misc; + +import org.bukkit.ChatColor; + +public class CC { + + public static final String RED = "" + ChatColor.RED; + public static final String DARK_RED = "" + ChatColor.DARK_RED; + public static final String AQUA = "" + ChatColor.AQUA; + public static final String DARK_AQUA = "" + ChatColor.DARK_AQUA; + public static final String BLUE = "" + ChatColor.BLUE; + public static final String DARK_BLUE = "" + ChatColor.DARK_BLUE; + public static final String GREEN = "" + ChatColor.GREEN; + public static final String DARK_GREEN = "" + ChatColor.DARK_GREEN; + public static final String PINK = "" + ChatColor.LIGHT_PURPLE; + public static final String PURPLE = "" + ChatColor.DARK_PURPLE; + public static final String YELLOW = "" + ChatColor.YELLOW; + public static final String GOLD = "" + ChatColor.GOLD; + public static final String GRAY = "" + ChatColor.GRAY; + public static final String DARK_GRAY = "" + ChatColor.DARK_GRAY; + public static final String WHITE = "" + ChatColor.WHITE; + public static final String BLACK = "" + ChatColor.BLACK; + public static final String ITALIC = "" + ChatColor.ITALIC; + public static final String BOLD = "" + ChatColor.BOLD; + public static final String STRIKE = "" + ChatColor.STRIKETHROUGH; + public static final String UNDERLINE = "" + ChatColor.UNDERLINE; + public static final String RANDOM = "" + ChatColor.MAGIC; + public static final String RESET = "" + ChatColor.RESET; + public String from(String string) { + switch(string.toLowerCase()) { + case "c": + return RED; + case "4": + return DARK_RED; + case "b": + return AQUA; + case "3": + return DARK_AQUA; + case "1": + return DARK_BLUE; + case "9": + return BLUE; + case "a": + return GREEN; + case "2": + return DARK_GREEN; + case "d": + return PINK; + case "5": + return PURPLE; + case "e": + return YELLOW; + case "6": + return GOLD; + case "7": + return GRAY; + case "8": + return DARK_GRAY; + case "f": + return WHITE; + case "0": + return BLACK; + case "o": + return ITALIC; + case "l": + return BOLD; + case "m": + return STRIKE; + case "n": + return UNDERLINE; + case "k": + return RANDOM; + } + return WHITE; + } + + public static String translate(String message) { + // random nullpointer mhm + return message.replace('&', 'ยง'); + + } + + public static String strip(String message) { + return ChatColor.stripColor(message); + } + +} diff --git a/src/main/java/me/abhi/practice/util/misc/EntityHider.java b/src/main/java/me/abhi/practice/util/misc/EntityHider.java new file mode 100644 index 0000000..2870bc2 --- /dev/null +++ b/src/main/java/me/abhi/practice/util/misc/EntityHider.java @@ -0,0 +1,371 @@ +package me.abhi.practice.util.misc; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import com.google.common.base.Preconditions; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; +import org.bukkit.Bukkit; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.world.ChunkUnloadEvent; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.Iterator; +import java.util.Map; + +import static com.comphenix.protocol.PacketType.Play.Server.*; + +public class EntityHider implements Listener { + + protected Table observerEntityMap = HashBasedTable.create(); + + // Packets that update remote player entities + private static PacketType[] ENTITY_PACKETS = { + ENTITY_EQUIPMENT, BED, ANIMATION, NAMED_ENTITY_SPAWN, + COLLECT, SPAWN_ENTITY, SPAWN_ENTITY_LIVING, SPAWN_ENTITY_PAINTING, SPAWN_ENTITY_EXPERIENCE_ORB, + ENTITY_LOOK, ENTITY_TELEPORT, ENTITY_HEAD_ROTATION, + ENTITY_STATUS, ATTACH_ENTITY, ENTITY_METADATA, ENTITY_EFFECT, REMOVE_ENTITY_EFFECT, + BLOCK_BREAK_ANIMATION + + // We don't handle DESTROY_ENTITY though + // Removed for knockback: ENTITY_VELOCITY, REL_ENTITY_MOVE, + }; + + /** + * The current entity visibility policy. + * + * @author Kristian + */ + public enum Policy { + /** + * All entities are invisible by default. Only entities specifically made visible may be seen. + */ + WHITELIST, + + /** + * All entities are visible by default. An entity can only be hidden explicitly. + */ + BLACKLIST, + } + + private ProtocolManager manager; + + // Listeners + private Listener bukkitListener; + private PacketAdapter protocolListener; + + // Current policy + protected Policy policy; + + /** + * Construct a new entity hider. + * + * @param plugin - the plugin that controls this entity hider. + * @param policy - the default visibility policy. + */ + public EntityHider(Plugin plugin, Policy policy) { + Preconditions.checkNotNull(plugin, "plugin cannot be NULL."); + + // Save policy + this.policy = policy; + this.manager = ProtocolLibrary.getProtocolManager(); + + // Register event and packet listener + plugin.getServer().getPluginManager().registerEvents( + bukkitListener = constructBukkit(), plugin); + manager.addPacketListener( + protocolListener = constructProtocol(plugin)); + } + + /** + * Set the visibility status of a given entity for a particular observer. + * + * @param observer - the observer player. + * @param entityID - ID of the entity that will be hidden or made visible. + * @param visible - TRUE if the entity should be made visible, FALSE if not. + * @return TRUE if the entity was visible before this method call, FALSE otherwise. + */ + protected boolean setVisibility(Player observer, int entityID, boolean visible) { + switch (policy) { + case BLACKLIST: + // Non-membership means they are visible + return !setMembership(observer, entityID, !visible); + case WHITELIST: + return setMembership(observer, entityID, visible); + default: + throw new IllegalArgumentException("Unknown policy: " + policy); + } + } + + /** + * Add or remove the given entity and observer entry from the table. + * + * @param observer - the player observer. + * @param entityID - ID of the entity. + * @param member - TRUE if they should be present in the table, FALSE otherwise. + * @return TRUE if they already were present, FALSE otherwise. + */ + // Helper method + protected boolean setMembership(Player observer, int entityID, boolean member) { + if (member) { + return observerEntityMap.put(observer.getEntityId(), entityID, true) != null; + } else { + return observerEntityMap.remove(observer.getEntityId(), entityID) != null; + } + } + + /** + * Determine if the given entity and observer is present in the table. + * + * @param observer - the player observer. + * @param entityID - ID of the entity. + * @return TRUE if they are present, FALSE otherwise. + */ + protected boolean getMembership(Player observer, int entityID) { + return observerEntityMap.contains(observer.getEntityId(), entityID); + } + + /** + * Determine if a given entity is visible for a particular observer. + * + * @param observer - the observer player. + * @param entityID - ID of the entity that we are testing for visibility. + * @return TRUE if the entity is visible, FALSE otherwise. + */ + protected boolean isVisible(Player observer, int entityID) { + // If we are using a whitelist, presence means visibility - if not, the opposite is the case + boolean presence = getMembership(observer, entityID); + + return policy == Policy.WHITELIST ? presence : !presence; + } + + /** + * Remove the given entity from the underlying map. + * + * @param entity - the entity to remove. + * @param destroyed - TRUE if the entity was killed, FALSE if it is merely unloading. + */ + protected void removeEntity(Entity entity, boolean destroyed) { + int entityID = entity.getEntityId(); + + Iterator> iterator = observerEntityMap.rowMap().values().iterator(); + + while (iterator.hasNext()) { + ((Map) iterator.next()).remove(entityID); + } + } + + /** + * Invoked when a player logs out. + * + * @param player - the player that jused logged out. + */ + protected void removePlayer(Player player) { + // Cleanup + observerEntityMap.rowMap().remove(player.getEntityId()); + } + + /** + * Construct the Bukkit event listener. + * + * @return Our listener. + */ + private Listener constructBukkit() { + return new Listener() { + @EventHandler + public void onEntityDeath(EntityDeathEvent e) { + removeEntity(e.getEntity(), true); + } + + @EventHandler + public void onChunkUnload(ChunkUnloadEvent e) { + for (Entity entity : e.getChunk().getEntities()) { + removeEntity(entity, false); + } + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent e) { + removePlayer(e.getPlayer()); + } + }; + } + + /** + * Construct the packet listener that will be used to intercept every entity-related packet. + * + * @param plugin - the parent plugin. + * @return The packet listener. + */ + private PacketAdapter constructProtocol(Plugin plugin) { + return new PacketAdapter(plugin, ENTITY_PACKETS) { + @Override + public void onPacketSending(PacketEvent event) { + int entityID = event.getPacket().getIntegers().read(0); + + // See if this packet should be cancelled + if (!isVisible(event.getPlayer(), entityID)) { + event.setCancelled(true); + } + } + }; + } + + /** + * Toggle the visibility status of an entity for a player. + *

+ * If the entity is visible, it will be hidden. If it is hidden, it will become visible. + * + * @param observer - the player observer. + * @param entity - the entity to toggle. + * @return TRUE if the entity was visible before, FALSE otherwise. + */ + public boolean toggleEntity(Player observer, Entity entity) { + if (isVisible(observer, entity.getEntityId())) { + return hideEntity(observer, entity); + } else { + return !showEntity(observer, entity); + } + } + + /** + * Allow the observer to see an entity with a opacity effect. + * + * @param observer - the observer. + * @param entity - the entity to show. + * @return TRUE if the entity was hidden before, FALSE otherwise. + */ + public boolean showFadedEntity(Player observer, Entity entity) { + validate(observer, entity); + boolean hiddenBefore = !setVisibility(observer, entity.getEntityId(), true); + + if (manager != null && hiddenBefore) { + manager.updateEntity(entity, Arrays.asList(observer)); + } + + return hiddenBefore; + } + + /** + * Allow the observer to see an entity that was previously hidden. + * + * @param observer - the observer. + * @param entity - the entity to show. + * @return TRUE if the entity was hidden before, FALSE otherwise. + */ + public boolean showEntity(Player observer, Entity entity) { + validate(observer, entity); + boolean hiddenBefore = !setVisibility(observer, entity.getEntityId(), true); + + // Resend packets + if (manager != null && hiddenBefore) { + manager.updateEntity(entity, Arrays.asList(observer)); + } + + return hiddenBefore; + } + + /** + * Prevent the observer from seeing a given entity. + * + * @param observer - the player observer. + * @param entity - the entity to hide. + * @return TRUE if the entity was previously visible, FALSE otherwise. + */ + public boolean hideEntity(Player observer, Entity entity) { + validate(observer, entity); + boolean visibleBefore = setVisibility(observer, entity.getEntityId(), false); + + if (visibleBefore) { + PacketContainer destroyEntity = new PacketContainer(ENTITY_DESTROY); + destroyEntity.getIntegerArrays().write(0, new int[]{entity.getEntityId()}); + + // Make the entity disappear + try { + manager.sendServerPacket(observer, destroyEntity); + } catch (InvocationTargetException e) { + throw new RuntimeException("Cannot send server packet.", e); + } + } + return visibleBefore; + } + + /** + * Determine if the given entity has been hidden from an observer. + * Note that the entity may very well be occluded or out of range from the perspective + * of the observer. This method simply checks if an entity has been completely hidden + * for that observer. + * + * @param observer - the observer. + * @param entity - the entity that may be hidden. + * @return TRUE if the player may see the entity, FALSE if the entity has been hidden. + */ + public boolean canSee(Player observer, Entity entity) { + validate(observer, entity); + + return isVisible(observer, entity.getEntityId()); + } + + // For valdiating the input parameters + private void validate(Player observer, Entity entity) { + Preconditions.checkNotNull(observer, "observer cannot be NULL."); + Preconditions.checkNotNull(entity, "entity cannot be NULL."); + } + + /** + * Show all online players to the given player. + * + * @param player + */ + public void showAllPlayers(Player player) { + for (Player p : Bukkit.getOnlinePlayers()) { + this.showEntity(player, p); + this.showEntity(p, player); + } + } + + /** + * Hide all online players to the given player. + * + * @param player + */ + public void hideAllPlayers(Player player) { + for (Player p : Bukkit.getOnlinePlayers()) { + if (p == player) continue; + + this.hideEntity(player, p); + this.hideEntity(p, player); + } + } + + /** + * Retrieve the current visibility policy. + * + * @return The current visibility policy. + * This version sent to: oscarj.cawood9 + */ + public Policy getPolicy() { + return policy; + } + + public void close() { + if (manager != null) { + HandlerList.unregisterAll(bukkitListener); + manager.removePacketListener(protocolListener); + manager = null; + } + } + +} \ No newline at end of file diff --git a/src/main/java/me/abhi/practice/util/misc/InventorySnapshot.java b/src/main/java/me/abhi/practice/util/misc/InventorySnapshot.java new file mode 100644 index 0000000..86efa6a --- /dev/null +++ b/src/main/java/me/abhi/practice/util/misc/InventorySnapshot.java @@ -0,0 +1,89 @@ +package me.abhi.practice.util.misc; + +import lombok.Getter; +import me.abhi.practice.PracticePlugin; +import me.abhi.practice.player.PracticeProfile; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Damageable; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.*; + +@Getter +public class InventorySnapshot { + + private Inventory inventory; + private Player opponent; + + private static HashMap inv = new HashMap(); + + public InventorySnapshot(final Player player) { + PracticeProfile practiceProfile = PracticePlugin.getInstance().getManagerHandler().getProfileManager().getProfile(player); + final ItemStack[] contents1 = player.getInventory().getContents(); + final ItemStack[] armor1 = player.getInventory().getArmorContents(); + List contents = new ArrayList<>(); + List armor = new ArrayList<>(); + for (int i = 0; i < contents1.length; i++) { + ItemStack itemStack = contents1[i]; + contents.add(i, itemStack); + } + for (int i = 0; i < armor1.length; i++) { + ItemStack itemStack = armor1[i]; + armor.add(i, itemStack); + } + + this.inventory = Bukkit.createInventory(null, 54, CC.translate(PracticePlugin.getInstance().getConfig().getString("menus.SNAPSHOT.name")).replace("%player%", player.getName())); + final int potCount = (int) Arrays.stream(contents1).filter(Objects::nonNull).map(ItemStack::getDurability).filter(d -> d == 16421).count(); + final double health = ((Damageable) player).getHealth(); + for (int i = 0; i < 9; ++i) { + if (contents.size() >= (i + 27) + 1) { + this.inventory.setItem(i + 27, contents.get(i)); + this.inventory.setItem(i + 18, contents.get(i + 27)); + this.inventory.setItem(i + 9, contents.get(i + 18)); + this.inventory.setItem(i, contents.get(i + 9)); + } + } + double multiplier = 100 / (practiceProfile.getThrownPots() > 0 ? practiceProfile.getThrownPots() : 1); + double potAccuracy = (multiplier * practiceProfile.getFullyLandedPots()); + if (potAccuracy > 100) { + potAccuracy = 100; + } + Map itemMap = new HashMap<>(); + for (String i : PracticePlugin.getInstance().getConfig().getConfigurationSection("menus.SNAPSHOT.items").getKeys(false)) { + String[] material = PracticePlugin.getInstance().getConfig().getString("menus.SNAPSHOT.items." + i + ".id").split(":"); + String name = CC.translate(PracticePlugin.getInstance().getConfig().getString("menus.SNAPSHOT.items." + i + ".name")); + List lore = new ArrayList<>(); + for (String l : PracticePlugin.getInstance().getInstance().getConfig().getStringList("menus.SNAPSHOT.items." + i + ".lore")) { + l = l.replace("%hits%", String.valueOf(practiceProfile.getHits())); + l = l.replace("%combo%", String.valueOf(practiceProfile.getCombo())); + l = l.replace("%longestCombo%", String.valueOf(practiceProfile.getLongestCombo())); + l = l.replace("%accuracy%", String.valueOf(potAccuracy)); + l = l.replace("%player%", player.getName()); + lore.add(l); + } + itemMap.put(i, new ItemBuilder(Material.getMaterial(Integer.parseInt(material[0]))).setDurability((short) Integer.parseInt(material[1])).setName(name.replace("%potions%", String.valueOf(potCount)).replace("%health%", String.valueOf(roundToHalves(health / 2)))).setLore(lore).toItemStack()); + } + this.inventory.setItem(PracticePlugin.getInstance().getConfig().getInt("menus.SNAPSHOT.items.player.slot"), itemMap.get("player")); + this.inventory.setItem(PracticePlugin.getInstance().getConfig().getInt("menus.SNAPSHOT.items.stats.slot"), itemMap.get("stats")); + this.inventory.setItem(PracticePlugin.getInstance().getConfig().getInt("menus.SNAPSHOT.items.pots.slot"), itemMap.get("pots")); + + for (int i = 0; i < 4; ++i) { + if (contents.size() >= i) { + this.inventory.setItem(39 - i, armor.get(i)); + } + inv.put(player.getUniqueId(), this); + } + } + + public static InventorySnapshot getByUUID(UUID uuid) { + return inv.get(uuid); + } + + public static double roundToHalves(double d) { + return Math.round(d * 2.0D) / 2.0D; + } + +} diff --git a/src/main/java/me/abhi/practice/util/misc/ItemBuilder.java b/src/main/java/me/abhi/practice/util/misc/ItemBuilder.java new file mode 100644 index 0000000..b91393a --- /dev/null +++ b/src/main/java/me/abhi/practice/util/misc/ItemBuilder.java @@ -0,0 +1,308 @@ +package me.abhi.practice.util.misc; + +import org.bukkit.Color; +import org.bukkit.DyeColor; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.LeatherArmorMeta; +import org.bukkit.inventory.meta.SkullMeta; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * Easily create itemstacks, without messing your hands. + * Note that if you do use this in one of your projects, leave this notice. + * Please do credit me if you do use this in one of your projects. + * + * @author NonameSL + */ +public class ItemBuilder { + private ItemStack is; + + /** + * Create a new ItemBuilder from scratch. + * + * @param m The material to create the ItemBuilder with. + */ + public ItemBuilder(Material m) { + this(m, 1); + } + + /** + * Create a new ItemBuilder over an existing itemstack. + * + * @param is The itemstack to create the ItemBuilder over. + */ + public ItemBuilder(ItemStack is) { + this.is = is; + } + + /** + * Create a new ItemBuilder from scratch. + * + * @param m The material of the item. + * @param amount The amount of the item. + */ + public ItemBuilder(Material m, int amount) { + is = new ItemStack(m, amount); + } + + /** + * Create a new ItemBuilder from scratch. + * + * @param m The material of the item. + * @param amount The amount of the item. + * @param durability The durability of the item. + */ + public ItemBuilder(Material m, int amount, byte durability) { + is = new ItemStack(m, amount, durability); + } + + /** + * Clone the ItemBuilder into a new one. + * + * @return The cloned instance. + */ + public ItemBuilder clone() { + return new ItemBuilder(is); + } + + /** + * Change the durability of the item. + * + * @param dur The durability to set it to. + */ + public ItemBuilder setDurability(short dur) { + is.setDurability(dur); + return this; + } + + /** + * Set the displayname of the item. + * + * @param name The name to change it to. + */ + public ItemBuilder setName(String name) { + ItemMeta im = is.getItemMeta(); + im.setDisplayName(name); + is.setItemMeta(im); + return this; + } + + /** + * Add an unsafe enchantment. + * + * @param ench The enchantment to add. + * @param level The level to put the enchant on. + */ + public ItemBuilder addUnsafeEnchantment(Enchantment ench, int level) { + is.addUnsafeEnchantment(ench, level); + return this; + } + + /** + * Remove a certain enchant from the item. + * + * @param ench The enchantment to remove + */ + public ItemBuilder removeEnchantment(Enchantment ench) { + is.removeEnchantment(ench); + return this; + } + + /** + * Set the skull owner for the item. Works on skulls only. + * + * @param owner The name of the skull's owner. + */ + public ItemBuilder setSkullOwner(String owner) { + try { + SkullMeta im = (SkullMeta) is.getItemMeta(); + im.setOwner(owner); + is.setItemMeta(im); + } catch (ClassCastException expected) { + } + return this; + } + + /** + * Add an enchant to the item. + * + * @param ench The enchant to add + * @param level The level + */ + public ItemBuilder addEnchant(Enchantment ench, int level) { + ItemMeta im = is.getItemMeta(); + im.addEnchant(ench, level, true); + is.setItemMeta(im); + return this; + } + + /** + * Add multiple enchants at once. + * + * @param enchantments The enchants to add. + */ + public ItemBuilder addEnchantments(Map enchantments) { + is.addEnchantments(enchantments); + return this; + } + + /** + * Sets infinity durability on the item by setting the durability to Short.MAX_VALUE. + */ + public ItemBuilder setInfinityDurability() { + is.setDurability(Short.MAX_VALUE); + return this; + } + + /** + * Re-sets the lore. + * + * @param lore The lore to set it to. + */ + public ItemBuilder setLore(String... lore) { + if (lore == null) { + return this; + } + ItemMeta im = is.getItemMeta(); + im.setLore(Arrays.asList(lore)); + is.setItemMeta(im); + return this; + } + + /** + * Re-sets the lore. + * + * @param lore The lore to set it to. + */ + public ItemBuilder setLore(List lore) { + if (lore == null) { + return this; + } + ItemMeta im = is.getItemMeta(); + + List translatedLore = new ArrayList<>(); + lore.forEach(l -> translatedLore.add(CC.translate(l))); + + im.setLore(translatedLore); + is.setItemMeta(im); + return this; + } + + /** + * Remove a lore line. + * + * @param lore The lore to remove. + */ + public ItemBuilder removeLoreLine(String line) { + ItemMeta im = is.getItemMeta(); + List lore = new ArrayList<>(im.getLore()); + if (!lore.contains(line)) return this; + lore.remove(line); + im.setLore(lore); + is.setItemMeta(im); + return this; + } + + /** + * Remove a lore line. + * + * @param index The index of the lore line to remove. + */ + public ItemBuilder removeLoreLine(int index) { + ItemMeta im = is.getItemMeta(); + List lore = new ArrayList<>(im.getLore()); + if (index < 0 || index > lore.size()) return this; + lore.remove(index); + im.setLore(lore); + is.setItemMeta(im); + return this; + } + + /** + * Add a lore line. + * + * @param line The lore line to add. + */ + public ItemBuilder addLoreLine(String line) { + ItemMeta im = is.getItemMeta(); + List lore = new ArrayList<>(); + if (im.hasLore()) lore = new ArrayList<>(im.getLore()); + lore.add(line); + im.setLore(lore); + is.setItemMeta(im); + return this; + } + + /** + * Add a lore line. + * + * @param line The lore line to add. + * @param pos The index of where to put it. + */ + public ItemBuilder addLoreLine(String line, int pos) { + ItemMeta im = is.getItemMeta(); + List lore = new ArrayList<>(im.getLore()); + lore.set(pos, line); + im.setLore(lore); + is.setItemMeta(im); + return this; + } + + /** + * Sets the dye color on an item. + * * Notice that this doesn't check for item type, sets the literal data of the dyecolor as durability. + * + * @param color The color to put. + */ + @SuppressWarnings("deprecation") + public ItemBuilder setDyeColor(DyeColor color) { + this.is.setDurability(color.getData()); + return this; + } + + /** + * Sets the dye color of a wool item. Works only on wool. + * + * @param color The DyeColor to set the wool item to. + * @see ItemBuilder@setDyeColor(DyeColor) + * @deprecated As of version 1.2 changed to setDyeColor. + */ + @Deprecated + public ItemBuilder setWoolColor(DyeColor color) { + if (!is.getType().equals(Material.WOOL)) return this; + this.is.setDurability(color.getData()); + return this; + } + + /** + * Sets the armor color of a leather armor piece. Works only on leather armor pieces. + * + * @param color The color to set it to. + */ + public ItemBuilder setLeatherArmorColor(Color color) { + try { + LeatherArmorMeta im = (LeatherArmorMeta) is.getItemMeta(); + im.setColor(color); + is.setItemMeta(im); + } catch (ClassCastException expected) { + } + return this; + } + + /** + * Retrieves the itemstack from the ItemBuilder. + * + * @return The itemstack created/modified by the ItemBuilder instance. + */ + public ItemStack toItemStack() { + return is; + } +} + diff --git a/src/main/java/me/abhi/practice/util/misc/Logger.java b/src/main/java/me/abhi/practice/util/misc/Logger.java new file mode 100644 index 0000000..1bd8306 --- /dev/null +++ b/src/main/java/me/abhi/practice/util/misc/Logger.java @@ -0,0 +1,14 @@ +package me.abhi.practice.util.misc; + +import org.bukkit.Bukkit; + +public class Logger { + + public static void success(String message) { + Bukkit.getConsoleSender().sendMessage(CC.GREEN + "[mPractice] " + message); + } + + public static void error(String message) { + Bukkit.getConsoleSender().sendMessage(CC.RED + "[mPractice] " + message); + } +} diff --git a/src/main/java/me/abhi/practice/util/misc/ScoreHelper.java b/src/main/java/me/abhi/practice/util/misc/ScoreHelper.java new file mode 100644 index 0000000..5df50e0 --- /dev/null +++ b/src/main/java/me/abhi/practice/util/misc/ScoreHelper.java @@ -0,0 +1,160 @@ +package me.abhi.practice.util.misc; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +/** + * @author crisdev333 + */ +public class ScoreHelper { + + private static HashMap players = new HashMap<>(); + + public static boolean hasScore(Player player) { + return players.containsKey(player.getUniqueId()); + } + + public static ScoreHelper createScore(Player player) { + return new ScoreHelper(player); + } + + public static ScoreHelper getByPlayer(Player player) { + return players.get(player.getUniqueId()); + } + + public static ScoreHelper removeScore(Player player) { + return players.remove(player.getUniqueId()); + } + + private Scoreboard scoreboard; + private Objective sidebar; + private Team enemy; + private Team friendly; + + private ScoreHelper(Player player) { + scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); + sidebar = scoreboard.registerNewObjective("sidebar", "dummy"); + sidebar.setDisplaySlot(DisplaySlot.SIDEBAR); + // Create Teams + + enemy = scoreboard.registerNewTeam("enemy"); + enemy.setPrefix(CC.RED + ""); + + friendly = scoreboard.registerNewTeam("friendly"); + friendly.setPrefix(CC.GREEN + ""); + + for (int i = 1; i <= 15; i++) { + Team team = scoreboard.registerNewTeam("SLOT_" + i); + team.addEntry(genEntry(i)); + } + player.setScoreboard(scoreboard); + players.put(player.getUniqueId(), this); + } + + public void setTitle(String title) { + title = ChatColor.translateAlternateColorCodes('&', title.replace("%splitter%", "โ”ƒ")); + sidebar.setDisplayName(title.length() > 32 ? title.substring(0, 32) : title); + } + + public void setSlot(int slot, String text) { + Team team = scoreboard.getTeam("SLOT_" + slot); + String entry = genEntry(slot); + if (!scoreboard.getEntries().contains(entry)) { + sidebar.getScore(entry).setScore(slot); + } + + text = ChatColor.translateAlternateColorCodes('&', text); + String pre = split(text)[0]; + String suf = split(text)[1]; + team.setPrefix(pre); + team.setSuffix(suf == null ? "" : suf); + + } + + public void removeSlot(int slot) { + String entry = genEntry(slot); + if (scoreboard.getEntries().contains(entry)) { + scoreboard.resetScores(entry); + } + } + + public void setSlotsFromList(List list) { + while (list.size() > 15) { + list.remove(list.size() - 1); + } + + int slot = list.size(); + + if (slot < 15) { + for (int i = (slot + 1); i <= 15; i++) { + removeSlot(i); + } + } + + for (String line : list) { + setSlot(slot, line.replace("%splitter%", "โ”ƒ")); + slot--; + } + } + + private String genEntry(int slot) { + return ChatColor.values()[slot].toString(); + } + + private String getFirstSplit(String s) { + return s.length() > 16 ? s.substring(0, 16) : s; + } + + private String getSecondSplit(String s) { + if (s.length() > 32) { + s = s.substring(0, 32); + } + return s.length() > 16 ? s.substring(16) : ""; + } + + private String[] split(String text) { + String[] splitted = new String[2]; + if (text.length() <= 16) { + splitted[0] = text; + } else { + String prefix = text.substring(0, 16), suffix = ""; + + if (prefix.endsWith("\u00a7")) { + prefix = prefix.substring(0, prefix.length() - 1); + suffix = "\u00a7" + suffix; + } + + suffix = StringUtils.left(ChatColor.getLastColors(prefix) + suffix + text.substring(16), 16); + splitted[0] = prefix; + splitted[1] = suffix; + } + return splitted; + } + + public void addFriendly(Player player) { + friendly.addEntry(player.getName()); + } + + public void addEnemy(Player player) { + enemy.addEntry(player.getName()); + } + + public void resetFriendly() { + friendly.getEntries().stream().forEach(e -> friendly.removeEntry(e)); + } + + public void resetEnemy() { + enemy.getEntries().stream().forEach(e -> enemy.removeEntry(e)); + } + +} \ No newline at end of file diff --git a/src/main/java/me/abhi/practice/util/misc/UUIDFetcher.java b/src/main/java/me/abhi/practice/util/misc/UUIDFetcher.java new file mode 100644 index 0000000..e231835 --- /dev/null +++ b/src/main/java/me/abhi/practice/util/misc/UUIDFetcher.java @@ -0,0 +1,120 @@ +package me.abhi.practice.util.misc; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.Charset; +import java.util.UUID; + +/* +Uncomment this if you want the helper method for BungeeCord: +import net.md_5.bungee.api.connection.ProxiedPlayer; +*/ + +/* +Uncomment this if you want the helper method for Bukkit/Spigot: +import org.bukkit.entity.Player; +*/ + +/** + * Helper-class for getting UUIDs of players + */ +public class UUIDFetcher { + + /** + * @param player The player + * @return The UUID of the given player + */ + //Uncomment this if you want the helper method for BungeeCord: + /* + public static UUID getUUID(ProxiedPlayer player) { + return getUUID(player.getName()); + } + */ + + /** + * @param player The player + * @return The UUID of the given player + */ + //Uncomment this if you want the helper method for Bukkit/Spigot: + /* + public static UUID getUUID(Player player) { + return getUUID(player.getName()); + } + */ + + /** + * @param playername The name of the player + * @return The UUID of the given player + */ + public static UUID getUUID(String playername) { + String output = callURL("https://api.mojang.com/users/profiles/minecraft/" + playername); + + StringBuilder result = new StringBuilder(); + + readData(output, result); + + String u = result.toString(); + + String uuid = ""; + + for (int i = 0; i <= 31; i++) { + uuid = uuid + u.charAt(i); + if (i == 7 || i == 11 || i == 15 || i == 19) { + uuid = uuid + "-"; + } + } + + return UUID.fromString(uuid); + } + + private static void readData(String toRead, StringBuilder result) { + int i = 7; + + while (i < 200) { + if (!String.valueOf(toRead.charAt(i)).equalsIgnoreCase("\"")) { + + result.append(String.valueOf(toRead.charAt(i))); + + } else { + break; + } + + i++; + } + } + + private static String callURL(String URL) { + StringBuilder sb = new StringBuilder(); + URLConnection urlConn = null; + InputStreamReader in = null; + try { + URL url = new URL(URL); + urlConn = url.openConnection(); + + if (urlConn != null) urlConn.setReadTimeout(60 * 1000); + + if (urlConn != null && urlConn.getInputStream() != null) { + in = new InputStreamReader(urlConn.getInputStream(), Charset.defaultCharset()); + BufferedReader bufferedReader = new BufferedReader(in); + + if (bufferedReader != null) { + int cp; + + while ((cp = bufferedReader.read()) != -1) { + sb.append((char) cp); + } + + bufferedReader.close(); + } + } + + in.close(); + } catch (Exception e) { + e.printStackTrace(); + } + + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/me/abhi/practice/util/reflection/BukkitReflection.java b/src/main/java/me/abhi/practice/util/reflection/BukkitReflection.java new file mode 100644 index 0000000..54e1a6e --- /dev/null +++ b/src/main/java/me/abhi/practice/util/reflection/BukkitReflection.java @@ -0,0 +1,130 @@ +package me.abhi.practice.util.reflection; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Server; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class BukkitReflection { // https://github.com/joeleoli/BukkitReflection + + private static final String CRAFT_BUKKIT_PACKAGE; + private static final String NET_MINECRAFT_SERVER_PACKAGE; + + private static final Class CRAFT_SERVER_CLASS; + private static final Method CRAFT_SERVER_GET_HANDLE_METHOD; + + private static final Class PLAYER_LIST_CLASS; + private static final Field PLAYER_LIST_MAX_PLAYERS_FIELD; + + private static final Class CRAFT_PLAYER_CLASS; + private static final Method CRAFT_PLAYER_GET_HANDLE_METHOD; + + private static final Class ENTITY_PLAYER_CLASS; + private static final Field ENTITY_PLAYER_PING_FIELD; + + private static final Class CRAFT_ITEM_STACK_CLASS; + private static final Method CRAFT_ITEM_STACK_AS_NMS_COPY_METHOD; + + static { + try { + String version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; + + CRAFT_BUKKIT_PACKAGE = "org.bukkit.craftbukkit." + version + "."; + NET_MINECRAFT_SERVER_PACKAGE = "net.minecraft.server." + version + "."; + + CRAFT_SERVER_CLASS = Class.forName(CRAFT_BUKKIT_PACKAGE + "CraftServer"); + CRAFT_SERVER_GET_HANDLE_METHOD = CRAFT_SERVER_CLASS.getDeclaredMethod("getHandle"); + CRAFT_SERVER_GET_HANDLE_METHOD.setAccessible(true); + + PLAYER_LIST_CLASS = Class.forName(NET_MINECRAFT_SERVER_PACKAGE + "PlayerList"); + PLAYER_LIST_MAX_PLAYERS_FIELD = PLAYER_LIST_CLASS.getDeclaredField("maxPlayers"); + PLAYER_LIST_MAX_PLAYERS_FIELD.setAccessible(true); + + CRAFT_PLAYER_CLASS = Class.forName(CRAFT_BUKKIT_PACKAGE + "entity.CraftPlayer"); + CRAFT_PLAYER_GET_HANDLE_METHOD = CRAFT_PLAYER_CLASS.getDeclaredMethod("getHandle"); + CRAFT_PLAYER_GET_HANDLE_METHOD.setAccessible(true); + + ENTITY_PLAYER_CLASS = Class.forName(NET_MINECRAFT_SERVER_PACKAGE + "EntityPlayer"); + ENTITY_PLAYER_PING_FIELD = ENTITY_PLAYER_CLASS.getDeclaredField("ping"); + ENTITY_PLAYER_PING_FIELD.setAccessible(true); + + CRAFT_ITEM_STACK_CLASS = Class.forName(CRAFT_BUKKIT_PACKAGE + "inventory.CraftItemStack"); + CRAFT_ITEM_STACK_AS_NMS_COPY_METHOD = CRAFT_ITEM_STACK_CLASS.getDeclaredMethod("asNMSCopy", ItemStack.class); + CRAFT_ITEM_STACK_AS_NMS_COPY_METHOD.setAccessible(true); + } catch (Exception e) { + e.printStackTrace(); + + throw new RuntimeException("Failed to initialize Bukkit/NMS Reflection"); + } + } + + public static int getPing(Player player) { + try { + int ping = ENTITY_PLAYER_PING_FIELD.getInt(CRAFT_PLAYER_GET_HANDLE_METHOD.invoke(player)); + + return ping > 0 ? ping : 0; + } catch (Exception e) { + return 1; + } + } + + public static void setMaxPlayers(Server server, int slots) { + try { + PLAYER_LIST_MAX_PLAYERS_FIELD.set(CRAFT_SERVER_GET_HANDLE_METHOD.invoke(server), slots); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static String getItemStackName(ItemStack itemStack) { + try { + return (String) CRAFT_ITEM_STACK_AS_NMS_COPY_METHOD.invoke(itemStack, itemStack); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + + public static void sendLightning(Player p, Location l) { + Class light = getNMSClass("EntityLightning"); + try { + Constructor constu = light.getConstructor(getNMSClass("World"), double.class, double.class, double.class, boolean.class, boolean.class); + Object wh = p.getWorld().getClass().getMethod("getHandle").invoke(p.getWorld()); + Object lighobj = constu.newInstance(wh, l.getX(), l.getY(), l.getZ(), false, false); + Object obj = getNMSClass("PacketPlayOutSpawnEntityWeather").getConstructor(getNMSClass("Entity")).newInstance(lighobj); + sendPacket(p, obj); + p.playSound(p.getLocation(), Sound.AMBIENCE_THUNDER, 20f, 2f); + } catch (NoSuchMethodException | SecurityException | + IllegalAccessException | IllegalArgumentException | + InvocationTargetException | InstantiationException e) { + e.printStackTrace(); + } + } + + public static Class getNMSClass(String name) { + String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; + try { + return Class.forName("net.minecraft.server." + version + "." + name); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + return null; + } + } + + public static void sendPacket(Player player, Object packet) { + try { + Object handle = player.getClass().getMethod("getHandle").invoke(player); + Object playerConnection = handle.getClass().getField("playerConnection").get(handle); + playerConnection.getClass().getMethod("sendPacket", getNMSClass("Packet")).invoke(playerConnection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..0e29bfd --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,434 @@ +KEY: "" + +mongo: + ip: localhost + port: 27017 + database: database + use-password: true + username: username + password: password + +scoreboard: + enabled: true + LOBBY: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&fOnline: &6%online%' + - '&fIn Fights: &6%fighting%' + - '&fIn Queues: &6%queueing%' + - '&7&m--------------------' + RANKED-QUEUE: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&fOnline: &6%online%' + - '&fIn Fights: &6%fighting%' + - '&fIn Queues: &6%queueing%' + - '&7&m--------------------' + - '&aRanked %kit%' + - '&6Time: &f%time%' + - '&6Searching: &f%minElo% - %maxElo%' + - '&7&m--------------------' + UNRANKED-QUEUE: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&fOnline: &6%online%' + - '&fIn Fights: &6%fighting%' + - '&fIn Queues: &6%queueing%' + - '&7&m--------------------' + - '&aUnranked %kit%' + - '&6Time: &f%time%' + - '&7&m--------------------' + UNRANKED-MATCH: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&fOpponent: &6%opponent%' + - '&fPing: &6%ping% ms&7 %splitter% &6%opponentPing% ms' + - '&fDuration: &6%time%' + - '&7&m--------------------' + RANKED-MATCH: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&fOpponent: &6%opponent%' + - '&fPing: &6%ping% ms&7 %splitter% &6%opponentPing% ms' + - '&fDuration: &6%time%' + - '&7&m--------------------' + SPECTATING: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - "&b%player1%" + - "&avs" + - "&c%player2%" + - '&7&m--------------------' + EDITING: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&fEditing Kit:&6 %kit%' + - '&7&m--------------------' + PARTY-LOBBY: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&fOnline: &6%online%' + - '&fIn Fights: &6%fighting%' + - '&fIn Queues: &6%queueing%' + - '&7&m--------------------' + - '&fLeader: &6%leader%' + - '&fMembers: &6%members%' + - '&7&m--------------------' + PARTY-MATCH: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&fTeam: &6%alive%/%all%' + - '&fOpponents:&6 %opponentAlive%/%opponentAll%' + - '&fDuration: &6%time%' + - '&7&m--------------------' + PARTY-MATCH-FFA: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&fAlive: &6%alive%/%all%' + - '&fDuration: &6%time%' + - '&7&m--------------------' + PARTY-MATCH-BARD: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&fTeam: &6%alive%/%all%' + - '&fOpponents:&6 %opponentAlive%/%opponentAll%' + - '&fBard Energy:&6 %energy%' + - '&fDuration: &6%time%' + - '&7&m--------------------' + SUMO-EVENT-STARTING: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&fEvent: &6Sumo' + - '&fPlayers: &6%players%/%max%' + - '&fStarting: &6%time%' + - '&7&m--------------------' + SUMO-EVENT-STARTED: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&fEvent: &6Sumo' + - '&fPlayers: &6%players%/%max%' + - '&fDuration: &6%time%' + - '&7&m--------------------' + TOURNAMENT-STARTING: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&6&lTournament' + - ' &7* &fKit: &6%kit%' + - ' &7* &fPlayers: &6%players%/%max%' + - ' &7* &fStarting: &6%time%' + - '&7&m--------------------' + TOURNAMENT-STARTED: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&6&lTournament' + - ' &7* &fKit: &6%kit%' + - ' &7* &fPlayers: &6%players%/%max%' + - ' &7* &fRound: &6%round%' + - ' &7* &fDuration: &6%time%' + - '&7&m--------------------' + TOURNAMENT-WAITING: + title: '&6&lPractice &7%splitter% &fPotPvP' + slots: + - '&7&m--------------------' + - '&6&lTournament' + - ' &7* &fKit: &6%kit%' + - ' &7* &fPlayers: &6%players%/%max%' + - ' &7* &fRound: &6%round%' + - ' &7* &fStarting: &6%time%' + - '&7&m--------------------' +items: + UNRANKED: + id: '267:0' + name: '&aJoin an Unranked Queue' + slot: 0 + lore-enabled: true + lore: + - '&7Right Click to open the Unranked GUI' + RANKED: + id: '276:0' + name: '&bJoin a Ranked Queue' + slot: 1 + lore-enabled: true + lore: + - '&7Right Click to open the Ranked GUI' + PARTY: + id: '399:0' + name: '&eCreate a Party' + slot: 4 + lore-enabled: true + lore: + - '&7Right Click to create a party' + EDITKIT: + id: '340:0' + name: '&5Edit a Kit' + slot: 8 + lore-enabled: true + lore: + - '&7Right Click to view edit a kit' + LEAVE_QUEUE: + id: '351:1' + name: '&cLeave Queue' + slot: 8 + lore-enabled: true + lore: + - '&7Right Click to leave queue' + CUSTOM_KIT: + id: '403:0' + name: '&e%kit% &a#%number%' + slot: 0 + lore-enabled: true + lore: + - '&7Right Click to activate custom kit' + DEFAULT_KIT: + id: '403:0' + name: '&eDefault Kit' + slot: 0 + lore-enabled: true + lore: + - '&7Right Click to activate default kit' + PARTY_EVENTS: + id: '286:0' + name: '&6Start a Party Event' + slot: 0 + lore-enabled: true + lore: + - '&7Right Click to open party event GUI' + HCF_SELECTOR: + id: '340:0' + name: '&aSelect HCF Kits' + slot: 1 + lore-enabled: true + lore: + - '&7Right Click to open HCF kit selector GUI' + LEADER_PARTY_INFO: + id: '339:0' + name: '&2Party Info' + slot: 4 + lore-enabled: true + lore: + - '&7Right Click to view party info' + PLAYER_PARTY_INFO: + id: '340:0' + name: '&2Party Info' + slot: 0 + lore-enabled: true + lore: + - '&7Right Click to view party info' + DISBAND_PARTY: + id: '351:1' + name: '&cDisband Party' + slot: 8 + lore-enabled: true + lore: + - '&7Right Click to disband party' + LEAVE_PARTY: + id: '351:1' + name: '&cLeave Party' + slot: 8 + lore-enabled: true + lore: + - '&7Right Click to leave party' + LEAVE_EVENT: + id: '351:1' + name: '&cLeave Event' + slot: 8 + lore-enabled: true + lore: + - '&7Right Click to leave the event' + LEAVE_TOURNAMENT: + id: '351:1' + name: '&cLeave Tournament' + slot: 8 + lore-enabled: true + lore: + - '&7Right Click to leave the tournament' + STOP_SPECTATING: + id: '76:0' + name: '&cStop Spectating' + slot: 8 + lore-enabled: true + lore: + - '&7Right Click to stop spectating' +menus: + UNRANKED: + name: '&aJoin an Unranked Queue' + rows: 2 + item-prefix: '&a' + item-lore: + - '&6&nUnranked Queue:' + - '&eIn queue: &a%queue%' + - '&eIn match: &a%match%' + - '' + - '&6Ranked Queue:' + - '&eIn queue: &a%rankedQueue%' + - '&eIn match: &a%rankedMatch%' + - '' + - '&eClick here to join the unranked queue for &a%kit%&e.' + RANKED: + name: '&bJoin an Ranked Queue' + rows: 2 + item-prefix: '&b' + item-lore: + - '&6Unranked Queue:' + - '&eIn queue: &a%unrankedQueue%' + - '&eIn match: &a%unrankedMatch%' + - '' + - '&6&nRanked Queue:' + - '&eIn queue: &a%queue%' + - '&eIn match: &a%match%' + - '' + - '&eClick here to join the ranked queue for &b%kit%&e.' + EDITKIT: + name: '&5Edit a Kit' + rows: 2 + item-prefix: '&5' + item-lore: + - '&eClick here to edit &5%kit%&e.' + PARTYFFA: + name: '&6Party FFA' + rows: 2 + item-prefix: '&6' + item-lore: + - '&eClick here to start a &6%kit% &effa.' + PARTYSPLIT: + name: '&7Party Split' + rows: 2 + item-prefix: '&7' + item-lore: + - '&eClick here to start a &7%kit% &esplit.' + DUEL: + name: '&3Select a Duel Kit' + rows: 2 + item-prefix: '&3' + item-lore: + - '&eClick here to send a &3%kit% &eduel.' + TOURNAMENT: + name: '&9Select a Tournament Kit' + rows: 2 + item-prefix: '&9' + item-lore: + - '&eClick here to start a &9%kit% &etournament.' + LEADERBOARDS: + name: '&bLeaderboards' + rows: 2 + item-prefix: '&bTop 10 | ' + SETTINGS: + name: '&6Settings' + item-prefix: "" + rows: 1 + items: + toggle-pms: + id: 340 + name: '&bToggle your private messages.' + command: '/tpm' + toggle-scoreboard: + id: 399 + name: '&bToggle your scoreboard.' + command: '/tsb' + toggle-duels: + id: 276 + name: '&bToggle your duels.' + command: '/tdr' + EDITLAYOUT: + name: '&eEditing Kit Layout' + items: + save-kit: + id: '54:0' + name: '&eSave Kit &a%kit% #%number%' + load-kit: + id: '340:0' + name: '&eLoad Kit &a%kit% #%number%' + rename-kit: + id: '421:0' + name: '&eRename Kit &a%kit% #%number%' + remove-kit: + id: '318:0' + name: '&eRemove Kit &a%kit% #%number%' + PARTYEVENTS: + name: '&6Start a Party Event' + rows: 3 + items: + ffa: + id: '286:0' + name: '&6Party FFA' + slot: 12 + split: + id: '267:0' + name: '&7Party Split' + slot: 14 + PARTYDUEL: + name: '&6Start a Party Duel' + rows: 3 + items: + regular: + id: '340:0' + name: '&6Select a Kit' + slot: 12 + hcf: + id: '276:0' + name: '&7HCF Team Fight' + slot: 14 + HCFKITS: + name: '&aSelect HCF Kits' + rows: 2 + items: + player: + id: '397:0' + name: '&e%player% &6[&e%kit%&6]' + SNAPSHOT: + name: "&7Inventory of &6%player%" + items: + player: + id: '397:0' + slot: 48 + name: "&eHealth: &c%health%/10" + lore: + - "&7%player%'s Health" + pots: + id: '373:16421' + slot: 50 + name: "&a%potions% Potions" + lore: + - "&7%player%'s Potions" + stats: + id: '283:0' + slot: 49 + name: "&eMatch Statistics" + lore: + - "&eHits: &6%hits%" + - "&eCombo: &6%combo%" + - "&eLongest Combo: &6%longestCombo%" + - "&ePotion accuracy: &6%accuracy%" + - +party-chat-format: '&d&l[P] %player%: &b%message%' +leaderboards-lore: "&a#%pos%&e. &a%player% &e(&a%elo%&e)" +settings: + default-elo: 1000 + max-elo: 2500 + min-elo: 0 + max-party-members: 10 + lightning-effect: true + delete-bottles: true + event-delay: 10 + players-per-event: 30 + players-per-tournament: 100 + show-players: false + leaderboards-gui: true + settings-gui: true + void-spawn: true + hide-invisibles-in-tab: false \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..1aef410 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,5 @@ +name: PotPvP +author: FrozenOrb +version: {git$-2au3so} +main: me.abhi.practice.PracticePlugin +depend: [ProtocolLib] \ No newline at end of file