buttons = Maps.newHashMap();
26 | for (KoTH koth : KoTH.getKoths()) {
27 | buttons.put(buttons.size(), new KoTHButton(koth));
28 | }
29 | return buttons;
30 | }
31 |
32 | @AllArgsConstructor
33 | private static class KoTHButton extends Button {
34 |
35 | private final KoTH koth;
36 |
37 | @Override
38 | public ItemStack getButtonItem(Player player) {
39 | return new ItemBuilder(Material.PAPER)
40 | .name("&b" + koth.getName())
41 | .lore("&7Click to host this KoTH!")
42 | .build();
43 | }
44 |
45 | @Override
46 | public void clicked(Player player, int slot, ClickType clickType, int hotbarButton) {
47 | Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "koth start " + koth.getName());
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/Selection.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.combofly.koth.cuboid.Cuboid;
5 | import dev.panda.item.ItemBuilder;
6 | import lombok.Data;
7 | import org.bukkit.Location;
8 | import org.bukkit.Material;
9 | import org.bukkit.entity.Player;
10 | import org.bukkit.inventory.ItemStack;
11 | import org.bukkit.metadata.FixedMetadataValue;
12 |
13 | @Data
14 | public class Selection {
15 |
16 | public static final ItemStack SELECTION_WAND;
17 | private static final String SELECTION_METADATA_KEY = "CLAIM_SELECTION";
18 |
19 | static {
20 | SELECTION_WAND = new ItemBuilder(Material.GOLD_AXE)
21 | .name("&6KoTH Wand")
22 | .lore("Use this item to select each corner,"
23 | , "both as high corner and low corner")
24 | .build();
25 | }
26 |
27 | private Location point1;
28 | private Location point2;
29 |
30 | /**
31 | * Private, so that we can create a new instance in the Selection#createOrGetSelection method.
32 | */
33 | private Selection() {
34 | }
35 |
36 | /**
37 | * Selections are stored in the player's metadata. This method removes the need to active Bukkit Metadata API calls
38 | * all over the place.
39 | *
40 | * This method can be modified structurally as needed, the plugin only accepts Selection objects via this method.
41 | *
42 | * @param player the player for whom to grab the Selection object for
43 | *
44 | * @return selection object, either new or created
45 | */
46 | public static Selection createOrGetSelection(Player player) {
47 | if (player.hasMetadata(SELECTION_METADATA_KEY)) {
48 | return (Selection) player.getMetadata(SELECTION_METADATA_KEY).get(0).value();
49 | }
50 |
51 | Selection selection = new Selection();
52 |
53 | player.setMetadata(SELECTION_METADATA_KEY, new FixedMetadataValue(ComboFly.get(), selection));
54 |
55 | return selection;
56 | }
57 |
58 | /**
59 | * @return the cuboid
60 | */
61 | public Cuboid getCuboid() {
62 | return new Cuboid(point1, point2);
63 | }
64 |
65 | /**
66 | * @return if the Selection can form a full cuboid object
67 | */
68 | public boolean isFullObject() {
69 | return point1 != null && point2 != null;
70 | }
71 |
72 | /**
73 | * Resets both locations in the Selection
74 | */
75 | public void clear() {
76 | point1 = null;
77 | point2 = null;
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/commands/HostCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.commands;
2 |
3 | import com.google.common.collect.Maps;
4 | import dev.panda.combofly.koth.KoTHMenu;
5 | import dev.panda.combofly.utilities.menu.Button;
6 | import dev.panda.combofly.utilities.menu.Menu;
7 | import dev.panda.command.BaseCommand;
8 | import dev.panda.command.Command;
9 | import dev.panda.command.CommandArgs;
10 | import dev.panda.item.ItemBuilder;
11 | import org.bukkit.Material;
12 | import org.bukkit.entity.Player;
13 | import org.bukkit.event.inventory.ClickType;
14 | import org.bukkit.inventory.ItemStack;
15 |
16 | import java.util.Map;
17 |
18 | public class HostCommand extends BaseCommand {
19 |
20 | @Command(name = "host", permission = "pandafly.host")
21 | @Override
22 | public void onCommand(CommandArgs commandArgs) {
23 | Player player = commandArgs.getPlayer();
24 |
25 | new HostMenu().openMenu(player);
26 | }
27 |
28 | private class HostMenu extends Menu {
29 |
30 | @Override
31 | public String getTitle(Player player) {
32 | return "&cHost a Event";
33 | }
34 |
35 | @Override
36 | public int getSize() {
37 | return 9*3;
38 | }
39 |
40 | @Override
41 | public Map getButtons(Player player) {
42 | Map buttons = Maps.newHashMap();
43 | buttons.put(13, new KoTHButton());
44 | return buttons;
45 | }
46 | }
47 |
48 | private class KoTHButton extends Button {
49 |
50 | @Override
51 | public ItemStack getButtonItem(Player player) {
52 | return new ItemBuilder(Material.NAME_TAG)
53 | .name("&9KoTH´s event")
54 | .lore("&7Click for open menu of all KoTH´s events")
55 | .build();
56 | }
57 |
58 | @Override
59 | public void clicked(Player player, int slot, ClickType clickType, int hotbarButton) {
60 | super.clicked(player, slot, clickType, hotbarButton);
61 | new KoTHMenu().openMenu(player);
62 | }
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/commands/KothCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.commands;
2 |
3 | import dev.panda.combofly.koth.commands.subcommands.*;
4 | import dev.panda.chat.ChatUtil;
5 | import dev.panda.command.BaseCommand;
6 | import dev.panda.command.Command;
7 | import dev.panda.command.CommandArgs;
8 | import org.bukkit.entity.Player;
9 |
10 | public class KothCommand extends BaseCommand {
11 |
12 | public KothCommand() {
13 | super();
14 | new CreateCommand();
15 | new WandCommand();
16 | new ListCommand();
17 | new StartCommand();
18 | new DeleteCommand();
19 | new ShowCommand();
20 | new InformationCommand();
21 | new TeleportCommand();
22 | new StopCommand();
23 | }
24 |
25 | @Command(name = "koth", permission = "pandafly.koth")
26 | @Override
27 | public void onCommand(CommandArgs commandArgs) {
28 | Player player = commandArgs.getPlayer();
29 | String label = commandArgs.getLabel();
30 |
31 | String[] messages = new String[]{ChatUtil.NORMAL_LINE,
32 | "&4&lKoTH &4Commands",
33 | "",
34 | " &7- &c" + label + " show (name)",
35 | " &7- &c" + label + " information (name)",
36 | " &7- &c" + label + " create (name)",
37 | " &7- &c" + label + " delete (name)",
38 | " &7- &c" + label + " wand",
39 | " &7- &c" + label + " list",
40 | " &7- &c" + label + " start (name)",
41 | " &7- &c" + label + " stop (name)",
42 | ChatUtil.NORMAL_LINE};
43 |
44 | for (String message : messages) {
45 | player.sendMessage(ChatUtil.translate(message));
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/commands/subcommands/CreateCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.commands.subcommands;
2 |
3 | import dev.panda.combofly.koth.KoTH;
4 | import dev.panda.combofly.koth.Selection;
5 | import dev.panda.chat.ChatUtil;
6 | import dev.panda.command.BaseCommand;
7 | import dev.panda.command.Command;
8 | import dev.panda.command.CommandArgs;
9 | import org.bukkit.entity.Player;
10 |
11 | import java.text.SimpleDateFormat;
12 | import java.util.Date;
13 |
14 | public class CreateCommand extends BaseCommand {
15 |
16 | @Command(name = "koth.create", permission = "pandafly.koth.create")
17 | @Override
18 | public void onCommand(CommandArgs commandArgs) {
19 | Player player = commandArgs.getPlayer();
20 | String[] args = commandArgs.getArgs();
21 |
22 | if (args.length == 0) {
23 | player.sendMessage(ChatUtil.translate("&cPlease insert a valid name!"));
24 | return;
25 | }
26 |
27 | String name = args[0];
28 | KoTH koth = new KoTH(name);
29 | Selection selection = Selection.createOrGetSelection(player);
30 |
31 | if (selection.isFullObject()) {
32 | koth.setCuboid(selection.getCuboid());
33 | koth.setCreator(player.getName());
34 | koth.setDate(new SimpleDateFormat("dd-MM-yyyy").format(new Date()));
35 | KoTH.getKoths().add(koth);
36 | koth.save();
37 | player.sendMessage(ChatUtil.translate("&aKoTH &b" + name + " &ahas been created!"));
38 | } else {
39 | player.sendMessage(ChatUtil.translate("&cPlease select a valid higher and lower locations"));
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/commands/subcommands/DeleteCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.commands.subcommands;
2 |
3 | import dev.panda.combofly.koth.KoTH;
4 | import dev.panda.chat.ChatUtil;
5 | import dev.panda.command.BaseCommand;
6 | import dev.panda.command.Command;
7 | import dev.panda.command.CommandArgs;
8 | import org.bukkit.entity.Player;
9 |
10 | public class DeleteCommand extends BaseCommand {
11 |
12 | @Command(name = "koth.delete", permission = "pandafly.koth.delete")
13 | @Override
14 | public void onCommand(CommandArgs commandArgs) {
15 | Player player = commandArgs.getPlayer();
16 | String[] args = commandArgs.getArgs();
17 |
18 | if (args.length == 0) {
19 | player.sendMessage(ChatUtil.translate("&cUsage: /koth delete (name)"));
20 | return;
21 | }
22 |
23 | String name = args[0];
24 | KoTH koth = KoTH.getFromName(name);
25 | if (koth != null) {
26 | koth.delete();
27 | player.sendMessage(ChatUtil.translate("&aKoTH &b" + name + " &ahas been deleted!"));
28 | } else {
29 | player.sendMessage(ChatUtil.translate("&cPlease insert a valid KoTH name!"));
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/commands/subcommands/InformationCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.commands.subcommands;
2 |
3 | import dev.panda.combofly.koth.KoTH;
4 | import dev.panda.combofly.koth.cuboid.Cuboid;
5 | import dev.panda.chat.ChatUtil;
6 | import dev.panda.command.BaseCommand;
7 | import dev.panda.command.Command;
8 | import dev.panda.command.CommandArgs;
9 | import org.bukkit.Location;
10 | import org.bukkit.entity.Player;
11 |
12 | public class InformationCommand extends BaseCommand {
13 |
14 | @Command(name = "koth.information", permission = "pandafly.koth.info", aliases = {"info"})
15 | @Override
16 | public void onCommand(CommandArgs commandArgs) {
17 | Player player = commandArgs.getPlayer();
18 | String[] args = commandArgs.getArgs();
19 |
20 | if (args.length == 0) {
21 | player.sendMessage(ChatUtil.translate("&cUsage: /koth information (name)"));
22 | return;
23 | }
24 |
25 | String name = args[0];
26 | KoTH koth = KoTH.getFromName(name);
27 |
28 | if (koth != null) {
29 | Cuboid cuboid = koth.getCuboid();
30 | Location center = cuboid.getCenter();
31 | Location upper = cuboid.getUpperCorner();
32 | Location lower = cuboid.getLowerCorner();
33 | String[] message = new String[]{ChatUtil.NORMAL_LINE,
34 | "&4&l" + koth.getName() + " &4Information",
35 | "",
36 | " &cDate&7: &f" + koth.getDate(),
37 | " &cCreator&7: &f" + koth.getCreator(),
38 | " &cCoords&7: &f" + center.getX() + ", " + center.getY() + ", " + center.getZ(),
39 | " &cCorners&7:",
40 | " &cUpper&7: " + upper.getX() + ", " + upper.getY() + ", " + upper.getZ(),
41 | " &cLower&7: " + lower.getX() + ", " + lower.getY() + ", " + lower.getZ(),
42 | ChatUtil.NORMAL_LINE};
43 |
44 | for (String s : message) {
45 | player.sendMessage(ChatUtil.translate(s));
46 | }
47 | } else {
48 | player.sendMessage(ChatUtil.translate("&cPlease insert a valid koth name!"));
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/commands/subcommands/ListCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.commands.subcommands;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.chat.ChatUtil;
5 | import dev.panda.command.BaseCommand;
6 | import dev.panda.command.Command;
7 | import dev.panda.command.CommandArgs;
8 | import dev.panda.file.FileConfig;
9 | import org.bukkit.command.CommandSender;
10 |
11 | public class ListCommand extends BaseCommand {
12 |
13 | @Command(name = "koth.list", permission = "pandafly.koth.list", inGameOnly = false)
14 | @Override
15 | public void onCommand(CommandArgs commandArgs) {
16 | CommandSender sender = commandArgs.getSender();
17 | FileConfig config = ComboFly.get().getKothsConfig();
18 |
19 | sender.sendMessage(ChatUtil.NORMAL_LINE);
20 | sender.sendMessage(ChatUtil.translate("&4&lKoTH List"));
21 | sender.sendMessage("");
22 | config.getConfiguration().getConfigurationSection("KOTHS").getKeys(false).forEach(koth -> {
23 | boolean enabled = config.getBoolean("KOTHS." + koth + ".enabled");
24 | sender.sendMessage(ChatUtil.translate(" &7- " + (enabled ? "&a" : "&c") + koth));
25 | });
26 | sender.sendMessage(ChatUtil.NORMAL_LINE);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/commands/subcommands/ShowCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.commands.subcommands;
2 |
3 | import dev.panda.combofly.koth.KoTH;
4 | import dev.panda.chat.ChatUtil;
5 | import dev.panda.command.BaseCommand;
6 | import dev.panda.command.Command;
7 | import dev.panda.command.CommandArgs;
8 | import org.bukkit.Location;
9 | import org.bukkit.entity.Player;
10 |
11 | public class ShowCommand extends BaseCommand {
12 |
13 | @Command(name = "koth.show")
14 | @Override
15 | public void onCommand(CommandArgs commandArgs) {
16 | Player player = commandArgs.getPlayer();
17 | String[] args = commandArgs.getArgs();
18 |
19 | if (args.length == 0) {
20 | player.sendMessage(ChatUtil.translate("&cUsage: /koth show (name)"));
21 | return;
22 | }
23 |
24 | String name = args[0];
25 | KoTH koth = KoTH.getFromName(name);
26 |
27 | if (koth != null) {
28 | Location center = koth.getCuboid().getCenter();
29 | String[] message = new String[]{ChatUtil.NORMAL_LINE,
30 | "&4&l" + koth.getName() + " &4Show",
31 | "",
32 | " &cTime Left&7: &f" + koth.getTimeLeft(),
33 | " &cCoords&7: &f" + center.getX() + ", " + center.getY() + ", " + center.getZ(),
34 | " &cCapper&7: &f" + koth.getCapper(),
35 | ChatUtil.NORMAL_LINE};
36 |
37 | for (String s : message) {
38 | player.sendMessage(ChatUtil.translate(s));
39 | }
40 | } else {
41 | player.sendMessage(ChatUtil.translate("&cPlease insert a valid koth name!"));
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/commands/subcommands/StartCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.commands.subcommands;
2 |
3 | import dev.panda.combofly.koth.KoTH;
4 | import dev.panda.chat.ChatUtil;
5 | import dev.panda.combofly.utilities.TimeUtil;
6 | import dev.panda.command.BaseCommand;
7 | import dev.panda.command.Command;
8 | import dev.panda.command.CommandArgs;
9 | import org.bukkit.entity.Player;
10 |
11 | public class StartCommand extends BaseCommand {
12 |
13 | @Command(name = "koth.start", permission = "pandafly.koth.start")
14 | @Override
15 | public void onCommand(CommandArgs commandArgs) {
16 | Player player = commandArgs.getPlayer();
17 | String[] args = commandArgs.getArgs();
18 | String label = commandArgs.getLabel();
19 |
20 | if (args.length == 0 || args.length == 1) {
21 | player.sendMessage(ChatUtil.translate("&cUsage: /koth start (name) (time)"));
22 | return;
23 | }
24 |
25 | String name = args[0];
26 | long time = TimeUtil.parseTime(args[1]);
27 | KoTH koth = KoTH.getFromName(name);
28 | if (koth != null) {
29 | koth.start(time);
30 | player.sendMessage(ChatUtil.translate("&aThe KoTH &b" + name + " &ahas been Started!"));
31 | } else {
32 | player.sendMessage(ChatUtil.translate("&cPlease usage a valid KoTH name."));
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/commands/subcommands/StopCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.commands.subcommands;
2 |
3 | import dev.panda.combofly.koth.KoTH;
4 | import dev.panda.chat.ChatUtil;
5 | import dev.panda.command.BaseCommand;
6 | import dev.panda.command.Command;
7 | import dev.panda.command.CommandArgs;
8 | import org.bukkit.entity.Player;
9 |
10 | public class StopCommand extends BaseCommand {
11 |
12 | @Command(name = "koth.stop", permission = "pandafly.koth.stop")
13 | @Override
14 | public void onCommand(CommandArgs commandArgs) {
15 | Player player = commandArgs.getPlayer();
16 | String[] args = commandArgs.getArgs();
17 |
18 | if (args.length == 0) {
19 | player.sendMessage(ChatUtil.translate("&cUsage: /koth stop (name)"));
20 | return;
21 | }
22 |
23 | KoTH koth = KoTH.getFromName(args[0]);
24 |
25 | if (koth != null) {
26 | koth.stop(false);
27 | player.sendMessage(ChatUtil.translate("&aKoTH stopped correctly"));
28 | } else {
29 | player.sendMessage("&cPlease insert a valid koth name!");
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/commands/subcommands/TeleportCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.commands.subcommands;
2 |
3 | import dev.panda.combofly.koth.KoTH;
4 | import dev.panda.chat.ChatUtil;
5 | import dev.panda.command.BaseCommand;
6 | import dev.panda.command.Command;
7 | import dev.panda.command.CommandArgs;
8 | import org.bukkit.entity.Player;
9 |
10 | public class TeleportCommand extends BaseCommand {
11 |
12 | @Command(name = "koth.teleport", permission = "pandafly.koth.teleport")
13 | @Override
14 | public void onCommand(CommandArgs commandArgs) {
15 | Player player = commandArgs.getPlayer();
16 | String[] args = commandArgs.getArgs();
17 |
18 | if (args.length == 0) {
19 | player.sendMessage(ChatUtil.translate("&cUsage: /koth teleport (name)"));
20 | return;
21 | }
22 |
23 | KoTH koth = KoTH.getFromName(args[0]);
24 |
25 | if (koth != null) {
26 | player.teleport(koth.getCuboid().getCenter());
27 | player.sendMessage(ChatUtil.translate("&aYou have been teleported to the KoTH successfully"));
28 | } else {
29 | player.sendMessage("&cPlease insert a valid koth name!");
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/commands/subcommands/WandCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.commands.subcommands;
2 |
3 | import dev.panda.combofly.koth.Selection;
4 | import dev.panda.chat.ChatUtil;
5 | import dev.panda.command.BaseCommand;
6 | import dev.panda.command.Command;
7 | import dev.panda.command.CommandArgs;
8 | import org.bukkit.entity.Player;
9 |
10 | public class WandCommand extends BaseCommand {
11 |
12 | @Command(name = "koth.wand", permission = "pandafly.koth.wand")
13 | @Override
14 | public void onCommand(CommandArgs commandArgs) {
15 | Player player = commandArgs.getPlayer();
16 |
17 | player.sendMessage(ChatUtil.translate("&eYou have received the KoTH Wand"));
18 | player.getInventory().addItem(Selection.SELECTION_WAND);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/cuboid/CuboidDirection.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.cuboid;
2 |
3 | /**
4 | * Represents directions that can be applied to certain faces and actions of a Cuboid
5 | */
6 | public enum CuboidDirection {
7 |
8 | NORTH,
9 | EASY,
10 | SOUTH,
11 | WEST,
12 | UP,
13 | DOWN,
14 | HORIZONTAL,
15 | VERTICAL,
16 | BOTH,
17 | UNKNOWN;
18 |
19 | public CuboidDirection opposite() {
20 | switch (this) {
21 | case NORTH:
22 | return SOUTH;
23 | case EASY:
24 | return WEST;
25 | case SOUTH:
26 | return NORTH;
27 | case WEST:
28 | return EASY;
29 | case HORIZONTAL:
30 | return VERTICAL;
31 | case VERTICAL:
32 | return HORIZONTAL;
33 | case UP:
34 | return DOWN;
35 | case DOWN:
36 | return UP;
37 | case BOTH:
38 | return BOTH;
39 | default:
40 | return UNKNOWN;
41 | }
42 | }
43 | }
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/event/EnterCuboidEvent.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.event;
2 |
3 | import dev.panda.combofly.koth.KoTH;
4 | import lombok.AllArgsConstructor;
5 | import lombok.Getter;
6 | import lombok.Setter;
7 | import org.bukkit.entity.Player;
8 | import org.bukkit.event.Event;
9 | import org.bukkit.event.HandlerList;
10 |
11 | @Getter
12 | @AllArgsConstructor
13 | public class EnterCuboidEvent extends Event {
14 |
15 | public static final HandlerList handlerList = new HandlerList();
16 | public Player player;
17 | public KoTH koth;
18 |
19 | @Override
20 | public HandlerList getHandlers() {
21 | return handlerList;
22 | }
23 |
24 | public static HandlerList getHandlerList() {
25 | return handlerList;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/event/LeaveCuboidEvent.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.event;
2 |
3 | import dev.panda.combofly.koth.KoTH;
4 | import lombok.AllArgsConstructor;
5 | import lombok.Getter;
6 | import lombok.Setter;
7 | import org.bukkit.entity.Player;
8 | import org.bukkit.event.Event;
9 | import org.bukkit.event.HandlerList;
10 |
11 | @Getter
12 | @AllArgsConstructor
13 | public class LeaveCuboidEvent extends Event {
14 |
15 | public static final HandlerList handlerList = new HandlerList();
16 | public Player player;
17 | public KoTH koth;
18 |
19 | @Override
20 | public HandlerList getHandlers() {
21 | return handlerList;
22 | }
23 |
24 | public static HandlerList getHandlerList() {
25 | return handlerList;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/koth/task/KoTHRunnable.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.koth.task;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.combofly.koth.KoTH;
5 | import dev.panda.chat.ChatUtil;
6 | import lombok.AllArgsConstructor;
7 | import org.bukkit.Bukkit;
8 | import org.bukkit.entity.Player;
9 | import org.bukkit.scheduler.BukkitRunnable;
10 |
11 | @AllArgsConstructor
12 | public class KoTHRunnable extends BukkitRunnable {
13 |
14 | private final KoTH koth;
15 |
16 | @Override
17 | public void run() {
18 | if (koth.isFinished()) {
19 | koth.stop(true);
20 | return;
21 | }
22 |
23 | if (koth.getCapPlayer() != null) {
24 | Player player = koth.getCapPlayer();
25 |
26 | if (player.isDead() || !player.isValid() || !player.isOnline()) {
27 | koth.setCappingPlayer(null);
28 | } else {
29 | if (koth.getDecisecondsLeft() % 600 == 0 && koth.getDecisecondsLeft() != koth.getCapTime() / 100 && koth.getDecisecondsLeft() != 0) {
30 | ComboFly.get().getMessageConfig().getStringList("KOTH.CONTEST").forEach(s ->
31 | Bukkit.broadcastMessage(ChatUtil.translate(s.replace("{koth}", koth.getName())
32 | .replace("{time}" , koth.getTimeLeft()))));
33 | }
34 | }
35 | }
36 | else koth.setTime(0);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/listeners/ChatListener.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.listeners;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.combofly.profile.Profile;
5 | import dev.panda.chat.ChatUtil;
6 | import me.clip.placeholderapi.PlaceholderAPI;
7 | import org.bukkit.Bukkit;
8 | import org.bukkit.entity.Player;
9 | import org.bukkit.event.EventHandler;
10 | import org.bukkit.event.Listener;
11 | import org.bukkit.event.player.AsyncPlayerChatEvent;
12 |
13 | public class ChatListener implements Listener {
14 |
15 | public ChatListener() {
16 | Bukkit.getServer().getPluginManager().registerEvents(this, ComboFly.get());
17 | }
18 |
19 | @EventHandler
20 | private void onChat(AsyncPlayerChatEvent event) {
21 | Player player = event.getPlayer();
22 | String message = event.getMessage();
23 | if (Bukkit.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) {
24 | message = PlaceholderAPI.setPlaceholders(player, message);
25 | }
26 |
27 | if (ComboFly.get().getFreezeManager().isFrozen(player)) {
28 | event.setCancelled(true);
29 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("CHAT.FROZEN")
30 | .replace("{player}", player.getName())
31 | .replace("{message}", message)));
32 | ComboFly.get().getStaffManager().sendMessageAllStaffs(ComboFly.get().getMessageConfig().getString("CHAT.FROZEN")
33 | .replace("{player}", player.getName())
34 | .replace("{message}", message));
35 | return;
36 | }
37 |
38 | if (ComboFly.get().getMessageConfig().getBoolean("CHAT.TOGGLE")) {
39 | String chat = ComboFly.get().getMessageConfig().getString("CHAT.FORMAT")
40 | .replace("{player}", player.getName())
41 | .replace("{prefix}", ComboFly.get().getRankManager().getRank().getPrefix(player.getUniqueId()))
42 | .replace("{suffix}", ComboFly.get().getRankManager().getRank().getSuffix(player.getUniqueId()))
43 | .replace("{kills}", String.valueOf(Profile.getProfiles().get(player.getUniqueId()).getKd().getKills()))
44 | .replace("{message}", (player.hasPermission("pandafly.chat.color") ? (ChatUtil.translate(message
45 | .replace("%", "%%"))) : (message
46 | .replace("%", "%%"))));
47 | event.setFormat(ChatUtil.translate(chat));
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/listeners/CombatListener.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.listeners;
2 |
3 | import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
4 | import dev.panda.combofly.ComboFly;
5 | import dev.panda.chat.ChatUtil;
6 | import org.bukkit.Bukkit;
7 | import org.bukkit.entity.Player;
8 | import org.bukkit.event.EventHandler;
9 | import org.bukkit.event.Listener;
10 | import org.bukkit.event.entity.EntityDamageByEntityEvent;
11 | import org.bukkit.event.entity.PlayerDeathEvent;
12 | import org.bukkit.event.player.PlayerKickEvent;
13 | import org.bukkit.event.player.PlayerQuitEvent;
14 | import org.bukkit.event.player.PlayerRespawnEvent;
15 |
16 | public class CombatListener implements Listener {
17 |
18 | public CombatListener() {
19 | Bukkit.getServer().getPluginManager().registerEvents(this, ComboFly.get());
20 | }
21 |
22 | @EventHandler
23 | private void onQuit(PlayerQuitEvent event) {
24 | Player player = event.getPlayer();
25 | if (ComboFly.get().getCombatManager().hasCooldown(player)) {
26 | player.setHealth(0.0);
27 | Bukkit.broadcastMessage(ChatUtil.translate("&7[&4Combat&7] &c" + player.getName() + " &fhas been disconnect in Combat."));
28 | }
29 | ComboFly.get().getCombatManager().removeCooldown(player);
30 | }
31 |
32 | @EventHandler
33 | private void onKick(PlayerKickEvent event) {
34 | Player player = event.getPlayer();
35 | if (ComboFly.get().getCombatManager().hasCooldown(player)) {
36 | player.setHealth(0.0);
37 | Bukkit.broadcastMessage(ChatUtil.translate("&7[&4Combat&7] &c" + player.getName() + " &fhas been disconnect in Combat."));
38 | }
39 | ComboFly.get().getCombatManager().removeCooldown(player);
40 | }
41 |
42 | @EventHandler
43 | private void onDeath(PlayerDeathEvent event) {
44 | if (event.getEntity() != null) {
45 | Player player = event.getEntity();
46 | if (ComboFly.get().getCombatManager().hasCooldown(player)) {
47 | ComboFly.get().getCombatManager().removeCooldown(player);
48 | }
49 | }
50 | }
51 |
52 | @EventHandler
53 | private void onRespawn(PlayerRespawnEvent event) {
54 | Player player = event.getPlayer();
55 | if (ComboFly.get().getCombatManager().hasCooldown(player)) ComboFly.get().getCombatManager().removeCooldown(player);
56 |
57 | if (!ComboFly.get().getStaffManager().isStaffMode(player)) {
58 | for (String kit: ComboFly.get().getKitConfig().getConfiguration().getConfigurationSection("KITS.").getKeys(false)) {
59 | if (!ComboFly.get().getKitManager().getDefaultKit().equals(kit)) {
60 | return;
61 | }
62 | ComboFly.get().getKitManager().equipKit(ComboFly.get().getKitManager().getDefaultKit(), player);
63 | }
64 | }
65 | if (ComboFly.get().getSpawnManager().getSpawnLocation() != null) {
66 | player.teleport(ComboFly.get().getSpawnManager().getSpawnLocation());
67 | } else System.out.println("No Spawn Location!");
68 | }
69 |
70 | @EventHandler
71 | private void onCombat(EntityDamageByEntityEvent event) {
72 | if (event.getDamager() instanceof Player && event.getEntity() instanceof Player) {
73 | Player player = (Player) event.getEntity();
74 | Player damager = (Player) event.getDamager();
75 | for (String claim : ComboFly.get().getClaimManager().getClaimList()) {
76 | CuboidSelection selection = new CuboidSelection(
77 | ComboFly.get().getClaimManager().getClaimWorld(claim),
78 | ComboFly.get().getClaimManager().getLocation(claim, "cornerA"),
79 | ComboFly.get().getClaimManager().getLocation(claim, "cornerB"));
80 | if (selection.contains(player.getLocation())
81 | && !ComboFly.get().getClaimManager().isPvPClaim(claim)) {
82 | return;
83 | }
84 | if (selection.contains(damager.getLocation())
85 | && !ComboFly.get().getClaimManager().isPvPClaim(claim)) {
86 | return;
87 | }
88 | }
89 | if (ComboFly.get().getStaffManager().isStaffMode(player) || ComboFly.get().getStaffManager().isStaffMode(damager)) {
90 | return;
91 | }
92 | ComboFly.get().getCombatManager().setCooldown(player);
93 | ComboFly.get().getCombatManager().setCooldown(damager);
94 | }
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/listeners/EnderpearlListener.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.listeners;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.chat.ChatUtil;
5 | import org.bukkit.Bukkit;
6 | import org.bukkit.GameMode;
7 | import org.bukkit.Material;
8 | import org.bukkit.entity.Player;
9 | import org.bukkit.event.EventHandler;
10 | import org.bukkit.event.Listener;
11 | import org.bukkit.event.block.Action;
12 | import org.bukkit.event.player.PlayerInteractEvent;
13 |
14 | public class EnderpearlListener implements Listener {
15 |
16 | public EnderpearlListener() {
17 | Bukkit.getServer().getPluginManager().registerEvents(this, ComboFly.get());
18 | }
19 |
20 | @EventHandler
21 | public void onPearl(PlayerInteractEvent event) {
22 | Player player = event.getPlayer();
23 | Action action = event.getAction();
24 |
25 | if (action.equals(Action.RIGHT_CLICK_AIR) || action.equals(Action.RIGHT_CLICK_BLOCK)) {
26 |
27 | if (player.getItemInHand().getType().equals(Material.ENDER_PEARL)
28 | && !player.getGameMode().equals(GameMode.CREATIVE)) {
29 |
30 | if (ComboFly.get().getEnderpearlManager().hasCooldown(player)) {
31 | event.setCancelled(true);
32 | player.updateInventory();
33 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("ENDERPEARL.ON-COOLDOWN")
34 | .replace("{cooldown}", ComboFly.get().getEnderpearlManager().getCooldown(player))));
35 | return;
36 | }
37 | ComboFly.get().getEnderpearlManager().setCooldown(player);
38 | }
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/listeners/FreezeListener.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.listeners;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.chat.ChatUtil;
5 | import org.bukkit.Bukkit;
6 | import org.bukkit.Material;
7 | import org.bukkit.entity.Player;
8 | import org.bukkit.event.EventHandler;
9 | import org.bukkit.event.Listener;
10 | import org.bukkit.event.block.BlockBreakEvent;
11 | import org.bukkit.event.block.BlockPlaceEvent;
12 | import org.bukkit.event.entity.EntityDamageByEntityEvent;
13 | import org.bukkit.event.entity.EntityDamageEvent;
14 | import org.bukkit.event.inventory.InventoryClickEvent;
15 | import org.bukkit.event.player.PlayerInteractEvent;
16 | import org.bukkit.event.player.PlayerMoveEvent;
17 | import org.bukkit.event.player.PlayerQuitEvent;
18 |
19 | public class FreezeListener implements Listener {
20 |
21 | public FreezeListener() {
22 | Bukkit.getPluginManager().registerEvents(this, ComboFly.get());
23 | }
24 |
25 | @EventHandler
26 | private void onFrozenQuit(PlayerQuitEvent event) {
27 | Player player = event.getPlayer();
28 |
29 | if (ComboFly.get().getFreezeManager().isFrozen(player)) {
30 | ComboFly.get().getFreezeManager().removeFreeze(player);
31 | ComboFly.get().getStaffManager().sendMessageAllStaffs(ComboFly.get().getMessageConfig().getString("FREEZE.FROZEN-PLAYER-DISCONNECT")
32 | .replace("{player}", player.getName()));
33 | }
34 | }
35 |
36 | @EventHandler
37 | private void onFrozenMove(PlayerMoveEvent event) {
38 | Player player = event.getPlayer();
39 |
40 | if (ComboFly.get().getFreezeManager().isFrozen(player)) {
41 | player.teleport(player.getLocation());
42 | }
43 | }
44 |
45 | @EventHandler
46 | private void onStaffInventory(InventoryClickEvent event) {
47 | Player player = (Player) event.getWhoClicked();
48 |
49 | if (ComboFly.get().getFreezeManager().isFrozen(player)) {
50 | event.setCancelled(true);
51 | player.updateInventory();
52 | }
53 | }
54 |
55 | @EventHandler
56 | private void onFrozenBreak(BlockBreakEvent event) {
57 | Player player = event.getPlayer();
58 |
59 | if (ComboFly.get().getFreezeManager().isFrozen(player)) {
60 | event.setCancelled(true);
61 | player.sendMessage(ChatUtil.translate("&cYou can't break blocks while you're frozen."));
62 | }
63 | }
64 |
65 | @EventHandler
66 | private void onFrozenPlace(BlockPlaceEvent event) {
67 | Player player = event.getPlayer();
68 |
69 | if (ComboFly.get().getFreezeManager().isFrozen(player)) {
70 | event.setCancelled(true);
71 | player.sendMessage(ChatUtil.translate("&cYou can't place blocks while you're frozen."));
72 | }
73 | }
74 |
75 | @EventHandler
76 | private void onFrozenPearl(PlayerInteractEvent event) {
77 | Player player = event.getPlayer();
78 |
79 | if (ComboFly.get().getFreezeManager().isFrozen(player)
80 | && player.getInventory().getItemInHand().getType().equals(Material.ENDER_PEARL)) {
81 | event.setCancelled(true);
82 | player.updateInventory();
83 | player.sendMessage(ChatUtil.translate("&cYou can't throw enderpearl while you're frozen."));
84 | }
85 | }
86 |
87 | @EventHandler
88 | public void onFrozenHit(EntityDamageByEntityEvent event) {
89 | if (event.getEntity() instanceof Player && event.getDamager() instanceof Player) {
90 |
91 | Player player = (Player) event.getEntity();
92 | Player target = (Player) event.getDamager();
93 |
94 | if (ComboFly.get().getFreezeManager().isFrozen(player)) {
95 | event.setCancelled(true);
96 | target.sendMessage(ChatUtil.translate("&c" + player.getName() + " is currently frozen."));
97 | }
98 | if (ComboFly.get().getFreezeManager().isFrozen(target)) {
99 | event.setCancelled(true);
100 | target.sendMessage(ChatUtil.translate("&cYou can't damage players while you're frozen."));
101 | }
102 | }
103 | }
104 |
105 | @EventHandler
106 | private void onFrozenDamage(EntityDamageEvent event) {
107 | if (event.getEntity() instanceof Player) {
108 |
109 | Player player = (Player) event.getEntity();
110 |
111 | if (ComboFly.get().getFreezeManager().isFrozen(player)) {
112 | event.setCancelled(true);
113 | }
114 | }
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/listeners/KillStreakListener.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.listeners;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import org.bukkit.Bukkit;
5 | import org.bukkit.entity.Player;
6 | import org.bukkit.event.EventHandler;
7 | import org.bukkit.event.Listener;
8 | import org.bukkit.event.entity.PlayerDeathEvent;
9 |
10 | import java.util.HashMap;
11 | import java.util.UUID;
12 |
13 | public class KillStreakListener implements Listener {
14 |
15 | public KillStreakListener() {
16 | Bukkit.getServer().getPluginManager().registerEvents(this, ComboFly.get());
17 | }
18 |
19 | private final HashMap killStreak = new HashMap<>();
20 |
21 | @EventHandler
22 | public void onPlayerDeath1(PlayerDeathEvent event) {
23 | if (event.getEntity().getKiller() != null && event.getEntity() != null) {
24 | Player killer = event.getEntity().getKiller();
25 | Player killed = event.getEntity();
26 |
27 | if (!killStreak.containsKey(killer.getUniqueId())) {
28 | killStreak.put(killer.getUniqueId(), 0);
29 | }
30 |
31 | int addKills = killStreak.get(killer.getUniqueId());
32 | killStreak.put(killer.getUniqueId(), addKills + 1);
33 | killStreak.remove(killed.getUniqueId());
34 | int kills = killStreak.get(killer.getUniqueId());
35 |
36 | for (String streak : ComboFly.get().getMainConfig().getConfiguration().getConfigurationSection("KILLSTREAK.REWARDS.").getKeys(false)) {
37 | if (streak.equals(String.valueOf(kills))) {
38 | ComboFly.get().getKillstreakManager().messageKillStreak(kills, killer);
39 | ComboFly.get().getKillstreakManager().messageReward(kills, killer);
40 | ComboFly.get().getKillstreakManager().getRepairAll(killer);
41 | ComboFly.get().getKillstreakManager().getReward(kills, killer);
42 | return;
43 | }
44 | }
45 | }
46 | }
47 | }
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/listeners/KnockBackListener.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.listeners;
2 |
3 | import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
4 | import dev.panda.combofly.ComboFly;
5 | import org.bukkit.Bukkit;
6 | import org.bukkit.entity.Player;
7 | import org.bukkit.event.EventHandler;
8 | import org.bukkit.event.Listener;
9 | import org.bukkit.event.entity.EntityDamageByEntityEvent;
10 | import org.bukkit.event.player.PlayerJoinEvent;
11 | import org.bukkit.util.Vector;
12 |
13 | public class KnockBackListener implements Listener {
14 |
15 | private final ComboFly plugin = ComboFly.get();
16 | private final boolean maxHeight = plugin.getMainConfig().getBoolean("KNOCKBACK.ENABLE-MAXHEIGHT");
17 |
18 | public KnockBackListener() {
19 | Bukkit.getServer().getPluginManager().registerEvents(this, plugin);
20 | }
21 |
22 | @EventHandler
23 | public void onDamage(EntityDamageByEntityEvent event) {
24 | if (event.getEntity() instanceof Player && event.getDamager() instanceof Player) {
25 | Player attacked = (Player) event.getEntity();
26 | Player attacker = (Player) event.getDamager();
27 |
28 | for (String claim : plugin.getClaimManager().getClaimList()) {
29 | CuboidSelection selection = new CuboidSelection(
30 | plugin.getClaimManager().getClaimWorld(claim),
31 | plugin.getClaimManager().getLocation(claim, "cornerA"),
32 | plugin.getClaimManager().getLocation(claim, "cornerB"));
33 | if (selection.contains(attacked.getLocation()) && !plugin.getClaimManager().isPvPClaim(claim))
34 | return;
35 | if (selection.contains(attacker.getLocation()) && !plugin.getClaimManager().isPvPClaim(claim))
36 | return;
37 | }
38 |
39 | if (plugin.getStaffManager().isStaffMode(attacker)) return;
40 |
41 | if (plugin.getKbManager().hasKnockBackEnabled()) {
42 | double vecX = plugin.getKbManager().getKbX();
43 | double vecY = plugin.getKbManager().getKbY();
44 | double vecZ = plugin.getKbManager().getKbZ();
45 | Vector dir = attacker.getLocation().getDirection();
46 | Vector vec = new Vector(dir.getX() * vecX, vecY, dir.getZ() * vecZ);
47 | attacked.setVelocity(vec);
48 | double highestKB = attacked.getLocation().getBlockY() - attacker.getLocation().getBlockY();
49 | double heightKB = plugin.getKbManager().getHeightKB();
50 | Vector dir2 = attacker.getLocation().getDirection();
51 |
52 | ComboFly.get().getServer().getScheduler().runTaskLaterAsynchronously(ComboFly.get(), () -> {
53 | if (maxHeight) {
54 | if (highestKB == heightKB) {
55 | Vector vec2 = new Vector(dir2.getX() * vecX, 0, dir2.getZ() * vecZ);
56 | attacked.setVelocity(vec2);
57 | }
58 | }
59 | if (highestKB > heightKB) {
60 | Vector vec2 = new Vector(dir2.getX() * vecX, -0.05, dir2.getZ() * vecZ);
61 | attacked.setVelocity(vec2);
62 | }
63 | }, 0L);
64 | }
65 | }
66 | }
67 |
68 | @EventHandler
69 | public void onTicksDamage(PlayerJoinEvent event) {
70 | if (plugin.getKbManager().hasMaxTicksEnabled()) {
71 | int ticks = ComboFly.get().getMainConfig().getInt("HIT-TICKS.TICKS");
72 | event.getPlayer().setMaximumNoDamageTicks(ticks);
73 | }
74 | }
75 | }
76 |
77 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/listeners/PlayerListener.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.listeners;
2 |
3 | import dev.panda.combofly.ComboFly;
4 |
5 | import dev.panda.combofly.commands.essentials.BuildCommand;
6 | import dev.panda.combofly.profile.Profile;
7 | import org.apache.commons.lang.WordUtils;
8 | import org.bukkit.*;
9 | import org.bukkit.entity.Player;
10 | import org.bukkit.event.EventHandler;
11 | import org.bukkit.event.Listener;
12 | import org.bukkit.event.block.BlockBreakEvent;
13 | import org.bukkit.event.block.BlockPlaceEvent;
14 | import org.bukkit.event.entity.FoodLevelChangeEvent;
15 | import org.bukkit.event.entity.PlayerDeathEvent;
16 |
17 | import dev.panda.chat.ChatUtil;
18 | import org.bukkit.event.player.*;
19 | import org.bukkit.event.weather.WeatherChangeEvent;
20 | import org.bukkit.event.world.ChunkUnloadEvent;
21 |
22 | public class PlayerListener implements Listener {
23 |
24 | public PlayerListener() {
25 | Bukkit.getServer().getPluginManager().registerEvents(this, ComboFly.get());
26 | }
27 |
28 | @EventHandler
29 | private void cancelSpawn(PlayerMoveEvent event) {
30 | if (ComboFly.get().getSpawnManager().hasCooldown(event.getPlayer())) {
31 | if (event.getFrom().getBlockX() == event.getTo().getBlockX()
32 | && event.getFrom().getBlockY() == event.getTo().getBlockY()
33 | && event.getFrom().getBlockZ() == event.getTo().getBlockZ())
34 | return;
35 | ComboFly.get().getSpawnManager().removeRunnable(event.getPlayer());
36 | ComboFly.get().getSpawnManager().removeCooldown(event.getPlayer());
37 | event.getPlayer().sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("SPAWN.CANCEL")));
38 | }
39 | }
40 |
41 | @EventHandler
42 | private void onQuit(PlayerQuitEvent event) {
43 | event.setQuitMessage(null);
44 | }
45 |
46 | @EventHandler
47 | public void onDropItem(PlayerDropItemEvent event) {
48 | if (event.getPlayer().getGameMode() != GameMode.CREATIVE) {
49 | event.setCancelled(true);
50 | }
51 | }
52 |
53 | @EventHandler
54 | public void onFoodLevelChange(FoodLevelChangeEvent event) {
55 | event.setCancelled(true);
56 | }
57 |
58 | @EventHandler
59 | private void onPlace(BlockPlaceEvent event) {
60 | Player player = event.getPlayer();
61 | event.setCancelled(!BuildCommand.mode.contains(player.getName()));
62 | }
63 |
64 | @EventHandler
65 | private void onBreak(BlockBreakEvent event) {
66 | Player player = event.getPlayer();
67 | event.setCancelled(!BuildCommand.mode.contains(player.getName()));
68 | }
69 |
70 | @EventHandler
71 | private void onWeather(WeatherChangeEvent event){
72 | event.setCancelled(true);
73 | }
74 |
75 | @EventHandler
76 | private void onChunkUnload(ChunkUnloadEvent event) {
77 | event.setCancelled(true);
78 | }
79 | }
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/listeners/ShopListener.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.listeners;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.combofly.profile.Profile;
5 | import dev.panda.chat.ChatUtil;
6 | import dev.panda.combofly.utilities.Ints;
7 | import org.bukkit.Bukkit;
8 | import org.bukkit.Material;
9 | import org.bukkit.block.Block;
10 | import org.bukkit.block.BlockState;
11 | import org.bukkit.block.Sign;
12 | import org.bukkit.entity.Player;
13 | import org.bukkit.event.EventHandler;
14 | import org.bukkit.event.Listener;
15 | import org.bukkit.event.block.Action;
16 | import org.bukkit.event.player.PlayerInteractEvent;
17 | import org.bukkit.inventory.ItemStack;
18 |
19 | public class ShopListener implements Listener {
20 |
21 | public ShopListener() {
22 | Bukkit.getPluginManager().registerEvents(this, ComboFly.get());
23 | }
24 |
25 | @EventHandler
26 | @Deprecated
27 | public void SignBuy(PlayerInteractEvent event){
28 | if (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
29 | Player player = event.getPlayer();
30 | Block block = event.getClickedBlock();
31 | BlockState state = block.getState();
32 | if (state instanceof Sign){
33 | Sign sign = (Sign) state;
34 | String line1 = sign.getLine(0);
35 | String line2 = sign.getLine(1);
36 | String line3 = sign.getLine(2);
37 | String line4 = sign.getLine(3);
38 | if (line1.contains("[Buy]")) {
39 | if (line2.contains(":")) {
40 | Material material = Material.matchMaterial(line2.replace("_", "").split(":")[0]);
41 | Integer amount = Ints.tryParse(line3);
42 | if (amount != null && material != null && line4.contains("$")) {
43 | int money = Integer.parseInt(line4.replace("$", ""));
44 |
45 | if (money > Profile.getProfiles().get(player.getUniqueId()).getBalance()) {
46 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("SHOP.ENOUGH-MONEY")));
47 | return;
48 | }
49 |
50 | int data = Integer.parseInt(line2.split(":")[1]);
51 | int playerBalance = (int) ComboFly.get().getBalanceType().getBalance(player);
52 | ComboFly.get().getBalanceType().removeBalance(player, playerBalance - money);
53 | player.getInventory().addItem(this.getItemData(material.getId(), amount, data));
54 | }
55 | }
56 | Material material = Material.matchMaterial(line2.replace("_", ""));
57 | Integer amount = Ints.tryParse(line3);
58 | if (amount != null && material != null && line4.contains("$")) {
59 | int money = Integer.parseInt(line4.replace("$", ""));
60 |
61 | if (money > Profile.getProfiles().get(player.getUniqueId()).getBalance()) {
62 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("SHOP.ENOUGH-MONEY")));
63 | return;
64 | }
65 |
66 | int playerBalance = (int) ComboFly.get().getBalanceType().getBalance(player);
67 | ComboFly.get().getBalanceType().removeBalance(player, playerBalance - money);
68 | player.getInventory().addItem(this.getItem(material.getId(), amount));
69 | }
70 | }
71 | }
72 | }
73 | }
74 |
75 | private ItemStack getItemData(int id, int amount, int data) {
76 | return new ItemStack(id, amount, (short) data);
77 | }
78 |
79 | private ItemStack getItem(int id, int amount) {
80 | return new ItemStack(id, amount);
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/managers/ClaimManager.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.managers;
2 |
3 | import com.sk89q.worldedit.bukkit.selections.Selection;
4 | import dev.panda.combofly.ComboFly;
5 | import org.bukkit.Bukkit;
6 | import org.bukkit.Location;
7 | import org.bukkit.World;
8 |
9 | import java.util.Set;
10 |
11 | public class ClaimManager {
12 |
13 | public void createClaimPvP(String claim, Selection sel) {
14 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".WORLD", sel.getMaximumPoint().getWorld().getName());
15 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".PVP", true);
16 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".cornerA.x", sel.getMaximumPoint().getX());
17 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".cornerA.y", sel.getMaximumPoint().getY());
18 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".cornerA.z", sel.getMaximumPoint().getZ());
19 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".cornerB.x", sel.getMinimumPoint().getX());
20 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".cornerB.y", sel.getMinimumPoint().getY());
21 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".cornerB.z", sel.getMinimumPoint().getZ());
22 | ComboFly.get().getClaimConfig().save();
23 | ComboFly.get().getClaimConfig().reload();
24 | }
25 |
26 | public void createClaimNoPvP(String claim, Selection sel) {
27 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".WORLD", sel.getMaximumPoint().getWorld().getName());
28 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".PVP", false);
29 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".cornerA.x", sel.getMaximumPoint().getX());
30 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".cornerA.y", sel.getMaximumPoint().getY());
31 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".cornerA.z", sel.getMaximumPoint().getZ());
32 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".cornerB.x", sel.getMinimumPoint().getX());
33 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".cornerB.y", sel.getMinimumPoint().getY());
34 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim + ".cornerB.z", sel.getMinimumPoint().getZ());
35 | ComboFly.get().getClaimConfig().save();
36 | ComboFly.get().getClaimConfig().reload();
37 | }
38 |
39 | public void deleteClaim(String claim) {
40 | ComboFly.get().getClaimConfig().getConfiguration().set("CLAIMS." + claim, null);
41 | ComboFly.get().getClaimConfig().save();
42 | ComboFly.get().getClaimConfig().reload();
43 | }
44 |
45 | public Location getLocation(String claim, String corner) {
46 | World world = Bukkit.getWorld(ComboFly.get().getClaimConfig().getString("CLAIMS." + claim + ".WORLD"));
47 | double x = ComboFly.get().getClaimConfig().getDouble("CLAIMS." + claim + "." + corner + ".x");
48 | double y = ComboFly.get().getClaimConfig().getDouble("CLAIMS." + claim + "." + corner + ".y");
49 | double z = ComboFly.get().getClaimConfig().getDouble("CLAIMS." + claim + "." + corner + ".z");
50 | return new Location(world, x, y, z);
51 | }
52 |
53 | public boolean isPvPClaim(String claim) {
54 | return ComboFly.get().getClaimConfig().getBoolean("CLAIMS." + claim + ".PVP");
55 | }
56 |
57 | public World getClaimWorld(String claim) {
58 | return Bukkit.getWorld(ComboFly.get().getClaimConfig().getString("CLAIMS." + claim + ".WORLD"));
59 | }
60 |
61 | public Set getClaimList() {
62 | return ComboFly.get().getClaimConfig().getConfiguration().getConfigurationSection("CLAIMS").getKeys(false);
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/managers/CombatManager.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.managers;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 | import org.bukkit.entity.Player;
6 |
7 | import java.util.HashMap;
8 | import java.util.UUID;
9 |
10 | @Getter
11 | @Setter
12 | public class CombatManager {
13 |
14 | private HashMap cooldown;
15 | private int time;
16 |
17 | public CombatManager() {
18 | this.cooldown = new HashMap<>();
19 | this.time = 30;
20 | }
21 |
22 | public boolean hasCooldown(Player player) {
23 | return this.cooldown.containsKey(player.getUniqueId()) && cooldown.get(player.getUniqueId()) > System.currentTimeMillis();
24 | }
25 |
26 | public String getCooldown(Player player) {
27 | return String.valueOf((this.cooldown.get(player.getUniqueId()) / 1000) - (System.currentTimeMillis() / 1000));
28 | }
29 |
30 | public void setCooldown(Player player) {
31 | this.cooldown.put(player.getUniqueId(), System.currentTimeMillis() + (this.getTime() * 1000));
32 | }
33 |
34 | public void removeCooldown(Player player) {
35 | this.cooldown.remove(player.getUniqueId());
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/managers/EnderpearlManager.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.managers;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import lombok.Getter;
5 | import lombok.Setter;
6 | import org.bukkit.entity.Player;
7 |
8 | import java.util.HashMap;
9 | import java.util.UUID;
10 |
11 | @Getter
12 | @Setter
13 | public class EnderpearlManager {
14 |
15 | private HashMap cooldown;
16 | private int time;
17 |
18 | public EnderpearlManager() {
19 | this.cooldown = new HashMap<>();
20 | this.time = ComboFly.get().getMessageConfig().getInt("ENDERPEARL.COOLDOWN");
21 | }
22 |
23 | public boolean hasCooldown(Player player) {
24 | return this.cooldown.containsKey(player.getUniqueId()) && cooldown.get(player.getUniqueId()) > System.currentTimeMillis();
25 | }
26 |
27 | public String getCooldown(Player player) {
28 | return String.valueOf((this.cooldown.get(player.getUniqueId()) / 1000) - (System.currentTimeMillis() / 1000));
29 | }
30 |
31 | public void setCooldown(Player player) {
32 | this.cooldown.put(player.getUniqueId(), System.currentTimeMillis() + (this.getTime() * 1000));
33 | }
34 |
35 | public void removeCooldown(Player player) {
36 | this.cooldown.remove(player.getUniqueId());
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/managers/FreezeManager.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.managers;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.chat.ChatUtil;
5 | import org.bukkit.entity.Player;
6 |
7 | import java.util.ArrayList;
8 | import java.util.List;
9 |
10 | public class FreezeManager {
11 |
12 | public List freeze = new ArrayList<>();
13 |
14 | public boolean isFrozen(Player player) {
15 | return freeze.contains(player.getName());
16 | }
17 |
18 | public void setFreeze(Player player) {
19 | freeze.add(player.getName());
20 | this.frozenMessage(player);
21 | }
22 |
23 | public void removeFreeze(Player player) {
24 | freeze.remove(player.getName());
25 | }
26 |
27 | private void frozenMessage(Player player) {
28 | for (String lines : ComboFly.get().getMessageConfig().getStringList("FREEZE.FROZEN")) {
29 | player.sendMessage(ChatUtil.translate(lines));
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/managers/KBManager.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.managers;
2 |
3 | import dev.panda.combofly.ComboFly;
4 |
5 | public class KBManager {
6 |
7 | public boolean hasKnockBackEnabled() {
8 | return ComboFly.get().getMainConfig().getBoolean("KNOCKBACK.ENABLE");
9 | }
10 | public boolean hasMaxTicksEnabled() {
11 | return ComboFly.get().getMainConfig().getBoolean("HIT-TICKS.ENABLE");
12 | }
13 |
14 | public void setKnockBack(double X, double Y, double Z) {
15 | ComboFly.get().getMainConfig().getConfiguration().set("KNOCKBACK.X", X);
16 | ComboFly.get().getMainConfig().getConfiguration().set("KNOCKBACK.Y", Y);
17 | ComboFly.get().getMainConfig().getConfiguration().set("KNOCKBACK.Z", Z);
18 | ComboFly.get().getMainConfig().save();
19 | ComboFly.get().getMainConfig().reload();
20 | }
21 | public double getKbX() { return ComboFly.get().getMainConfig().getDouble("KNOCKBACK.X"); }
22 | public double getKbY() { return ComboFly.get().getMainConfig().getDouble("KNOCKBACK.Y"); }
23 | public double getKbZ() { return ComboFly.get().getMainConfig().getDouble("KNOCKBACK.Z"); }
24 |
25 | public void setHeightKB(double HeightKB){
26 | ComboFly.get().getMainConfig().getConfiguration().set("KNOCKBACK.MAXHEIGHT", HeightKB);
27 | ComboFly.get().getMainConfig().save();
28 | ComboFly.get().getMainConfig().reload();
29 | }
30 | public double getHeightKB(){
31 | return ComboFly.get().getMainConfig().getDouble("KNOCKBACK.MAXHEIGHT");
32 | }
33 | }
34 |
35 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/managers/KillStreakManager.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.managers;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.chat.ChatUtil;
5 | import org.bukkit.Bukkit;
6 | import org.bukkit.Material;
7 | import org.bukkit.entity.Player;
8 | import org.bukkit.inventory.ItemStack;
9 | import org.bukkit.inventory.meta.Repairable;
10 |
11 | public class KillStreakManager {
12 |
13 | public void messageKillStreak(int streak, Player player) {
14 | String message = ComboFly.get().getMainConfig().getString("KILLSTREAK.MESSAGE")
15 | .replace("{streak}", String.valueOf(streak))
16 | .replace("{player}", player.getName());
17 | Bukkit.broadcastMessage(ChatUtil.translate(message));
18 | }
19 |
20 | public void messageReward(int streak, Player player){
21 | for (String message : ComboFly.get().getMainConfig().getConfiguration().getConfigurationSection("KILLSTREAK.REWARDS.STREAK." + streak + ".MESSAGE").getKeys(false)) {
22 | player.sendMessage(ChatUtil.translate(message));
23 | }
24 | }
25 |
26 | public void getRepairAll(Player p) {
27 | for (String streak : ComboFly.get().getMainConfig().getConfiguration().getConfigurationSection("KILLSTREAK.REWARDS.STREAK").getKeys(false)) {
28 | if (ComboFly.get().getMainConfig().getBoolean("KILLSTREAK.REWARDS.STREAK." + streak + ".REPAIRALL")) {
29 | for (ItemStack items : p.getInventory().getContents()) {
30 | this.canRepair(items);
31 | }
32 | for (ItemStack items : p.getInventory().getArmorContents()) {
33 | this.canRepair(items);
34 | }
35 | p.updateInventory();
36 | }
37 | }
38 | }
39 | public void getReward(int streak, Player player) {
40 | for (String commands : ComboFly.get().getMainConfig().getStringList("KILLSTREAK.REWARDS.STREAK." + streak + ".COMMANDS")) {
41 | Bukkit.dispatchCommand(Bukkit.getConsoleSender(), commands
42 | .replace("{player}", player.getName()));
43 | }
44 | }
45 | private void canRepair(ItemStack item) {
46 | if (item instanceof Repairable) {
47 | item.setDurability((short)0);
48 | }
49 | }
50 | }
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/managers/SpeedManager.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.managers;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.chat.ChatUtil;
5 | import org.bukkit.entity.Player;
6 |
7 | public class SpeedManager {
8 |
9 | private int walkSpeed;
10 | private int flySpeed;
11 |
12 | public SpeedManager() {
13 | this.walkSpeed = 0;
14 | this.flySpeed = 0;
15 | }
16 |
17 | public void getWalkSpeed(String amount, Player player) {
18 | try {
19 | this.walkSpeed = Integer.parseInt(amount);
20 | }
21 | catch (NumberFormatException e) {
22 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("SPEED.WALK.WRONG-FORMAT")));
23 | return;
24 | }
25 | if (this.walkSpeed < 1 || this.walkSpeed > 10) {
26 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("SPEED.WALK.WRONG-FORMAT")));
27 | return;
28 | }
29 | player.setWalkSpeed((float) this.walkSpeed / 10);
30 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("SPEED.WALK.SPEED")
31 | .replace("{speed}", String.valueOf(this.walkSpeed))));
32 | }
33 |
34 | public void getFlySpeed(String amount, Player player) {
35 | try {
36 | this.flySpeed = Integer.parseInt(amount);
37 | }
38 | catch (NumberFormatException e) {
39 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("SPEED.FLY.WRONG-FORMAT")));
40 | return;
41 | }
42 | if (this.flySpeed < 1 || this.flySpeed > 10) {
43 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("SPEED.FLY.WRONG-FORMAT")));
44 | return;
45 | }
46 | player.setFlySpeed((float) this.flySpeed / 10);
47 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("SPEED.FLY.SPEED")
48 | .replace("{speed}", String.valueOf(this.flySpeed))));
49 | }
50 | }
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/managers/VanishManager.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.managers;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import org.bukkit.Bukkit;
5 | import org.bukkit.entity.Player;
6 |
7 | import java.util.ArrayList;
8 | import java.util.List;
9 |
10 | public class VanishManager {
11 |
12 | public List vanish = new ArrayList<>();
13 |
14 | public boolean isVanish(Player player) {
15 | return vanish.contains(player.getName());
16 | }
17 |
18 | public void setVanish(Player player) {
19 | vanish.add(player.getName());
20 | for (Player online : Bukkit.getServer().getOnlinePlayers()) {
21 | if (ComboFly.get().getStaffManager().isStaff(online)) {
22 | online.showPlayer(player);
23 | }
24 | else {
25 | online.hidePlayer(player);
26 | }
27 | }
28 | }
29 |
30 | public void removeVanish(Player player) {
31 | vanish.remove(player.getName());
32 | for (Player online : Bukkit.getServer().getOnlinePlayers()) {
33 | online.showPlayer(player);
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/managers/WarpManager.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.managers;
2 |
3 | import java.util.Set;
4 |
5 | import dev.panda.combofly.ComboFly;
6 | import org.bukkit.Bukkit;
7 | import org.bukkit.Location;
8 | import org.bukkit.World;
9 | import org.bukkit.entity.Player;
10 |
11 | public class WarpManager {
12 |
13 | public void createWarp(String warp, Player player) {
14 | ComboFly.get().getWarpConfig().getConfiguration().set("WARPS." + warp + ".WORLD", player.getWorld().getName());
15 | ComboFly.get().getWarpConfig().getConfiguration().set("WARPS." + warp + ".X", player.getLocation().getX());
16 | ComboFly.get().getWarpConfig().getConfiguration().set("WARPS." + warp + ".Y", player.getLocation().getY());
17 | ComboFly.get().getWarpConfig().getConfiguration().set("WARPS." + warp + ".Z", player.getLocation().getZ());
18 | ComboFly.get().getWarpConfig().getConfiguration().set("WARPS." + warp + ".YAW", player.getLocation().getYaw());
19 | ComboFly.get().getWarpConfig().getConfiguration().set("WARPS." + warp + ".PITCH", player.getLocation().getPitch());
20 | ComboFly.get().getWarpConfig().save();
21 | ComboFly.get().getWarpConfig().reload();
22 | }
23 |
24 | public void deleteWarp(String warp) {
25 | ComboFly.get().getWarpConfig().getConfiguration().set("WARPS." + warp, null);
26 | ComboFly.get().getWarpConfig().save();
27 | ComboFly.get().getWarpConfig().reload();
28 | }
29 |
30 | public Location getWarpLocation(String warp) {
31 | return new Location(
32 | getWarpWorld(warp),
33 | getWarpX(warp),
34 | getWarpY(warp),
35 | getWarpZ(warp),
36 | getWarpYaw(warp),
37 | getWarpPitch(warp));
38 | }
39 |
40 | public Set getWarps() {
41 | return ComboFly.get().getWarpConfig().getConfiguration().getConfigurationSection("WARPS").getKeys(false);
42 | }
43 |
44 | private World getWarpWorld(String warp) {
45 | return Bukkit.getWorld(ComboFly.get().getWarpConfig().getString("WARPS." + warp + ".WORLD"));
46 | }
47 |
48 | private double getWarpX(String warp) {
49 | return ComboFly.get().getWarpConfig().getDouble("WARPS." + warp + ".X");
50 | }
51 |
52 | private double getWarpY(String warp) {
53 | return ComboFly.get().getWarpConfig().getDouble("WARPS." + warp + ".Y");
54 | }
55 |
56 | private double getWarpZ(String warp) {
57 | return ComboFly.get().getWarpConfig().getDouble("WARPS." + warp + ".Z");
58 | }
59 |
60 | private int getWarpYaw(String warp) {
61 | return ComboFly.get().getWarpConfig().getInt("WARPS." + warp + ".YAW");
62 | }
63 |
64 | private int getWarpPitch(String warp) {
65 | return ComboFly.get().getWarpConfig().getInt("WARPS." + warp + ".PITCH");
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/profile/Profile.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.profile;
2 |
3 | import com.google.common.collect.Lists;
4 | import com.google.common.collect.Maps;
5 | import dev.panda.combofly.ComboFly;
6 | import dev.panda.combofly.profile.comparator.ProfileDeathsComparator;
7 | import dev.panda.combofly.profile.comparator.ProfileKillsComparator;
8 | import dev.panda.combofly.profile.entry.KDEntry;
9 | import dev.panda.file.FileConfig;
10 | import lombok.Getter;
11 | import lombok.Setter;
12 | import org.bukkit.Bukkit;
13 | import org.bukkit.entity.Player;
14 |
15 | import java.util.*;
16 | import java.util.function.Supplier;
17 | import java.util.stream.Collectors;
18 |
19 | @Getter @Setter
20 | public class Profile implements Supplier {
21 |
22 | @Getter public static Map profiles = Maps.newHashMap();
23 | @Getter public static Map> leaderboards = Maps.newHashMap();
24 | private final UUID uuid;
25 | private String name;
26 | private KDEntry kd;
27 | private int balance;
28 |
29 | public Profile(UUID uuid, String name) {
30 | this.uuid = uuid;
31 | this.name = name;
32 | this.kd = new KDEntry(0, 0);
33 | }
34 |
35 | public static void init() {
36 | ComboFly.get().getServer().getScheduler().runTaskTimerAsynchronously(ComboFly.get(), () -> {
37 | for (Player online : Bukkit.getOnlinePlayers()) {
38 | profiles.get(online.getUniqueId()).save(online);
39 | }
40 | }, 6000L, 6000L);
41 |
42 | ComboFly.get().getProfileConfig().getConfiguration().getConfigurationSection("PROFILES").getKeys(false).forEach(uuids -> {
43 | UUID uuid = UUID.fromString(uuids);
44 | Profile profile = new Profile(uuid, Bukkit.getOfflinePlayer(uuid).getName());
45 | profile.load();
46 | profiles.put(uuid, profile);
47 | });
48 |
49 | ComboFly.get().getServer().getScheduler().runTaskTimerAsynchronously(ComboFly.get(), () -> {
50 | leaderboards.clear();
51 | leaderboards.put("kills", profiles.values().stream()
52 | .sorted(new ProfileKillsComparator().reversed())
53 | .collect(Collectors.toList()));
54 | leaderboards.put("deaths", profiles.values().stream()
55 | .sorted(new ProfileDeathsComparator().reversed())
56 | .collect(Collectors.toList()));
57 | }, 40L, 1800L);
58 | }
59 |
60 | public static Profile get(UUID uuid) {
61 | return profiles.get(uuid);
62 | }
63 |
64 | public void save(Player player) {
65 | FileConfig config = ComboFly.get().getProfileConfig();
66 |
67 | if (player != null) config.getConfiguration().set("PROFILES." + uuid + ".name", player.getName());
68 | config.getConfiguration().set("PROFILES." + uuid + ".kills", kd.getKills());
69 | config.getConfiguration().set("PROFILES." + uuid + ".deaths", kd.getDeaths());
70 | config.getConfiguration().set("PROFILES." + uuid + ".balance", balance);
71 |
72 | config.save();
73 | config.reload();
74 | }
75 |
76 | public void load() {
77 | FileConfig config = ComboFly.get().getProfileConfig();
78 | try {
79 | this.name = Bukkit.getOfflinePlayer(uuid).getName();
80 | this.kd.setKills(config.getInt("PROFILES." + uuid + ".kills"));
81 | this.kd.setDeaths(config.getInt("PROFILES." + uuid + ".deaths"));
82 | this.balance = config.getInt("PROFILES." + uuid + ".balance");
83 | }
84 | catch (Exception exception) {
85 | this.kd.setKills(0);
86 | this.kd.setDeaths(0);
87 | this.balance = 0;
88 | }
89 | }
90 |
91 | @Override
92 | public Profile get() {
93 | return this;
94 | }
95 | }
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/profile/commands/EnderChestCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.profile.commands;
2 |
3 | import dev.panda.chat.ChatUtil;
4 | import dev.panda.combofly.ComboFly;
5 | import dev.panda.command.BaseCommand;
6 | import dev.panda.command.Command;
7 | import dev.panda.command.CommandArgs;
8 | import org.bukkit.Bukkit;
9 | import org.bukkit.entity.Player;
10 |
11 | public class EnderChestCommand extends BaseCommand {
12 |
13 | @Command(name = "enderchest", permission = "pandafly.enderchest", aliases = {"ec", "echest"})
14 | @Override
15 | public void onCommand(CommandArgs command) {
16 | Player player = command.getPlayer();
17 | String[] args = command.getArgs();
18 |
19 | if (args.length < 1) {
20 | if (ComboFly.get().getCombatManager().hasCooldown(player)) {
21 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("SPAWN.COMBAT")));
22 | return;
23 | }
24 |
25 | player.openInventory(player.getEnderChest());
26 | return;
27 | }
28 |
29 | if (ComboFly.get().getCombatManager().hasCooldown(player)) {
30 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("SPAWN.COMBAT")));
31 | return;
32 | }
33 |
34 | if (!player.hasPermission("pandafly.enderchest.others")) {
35 | player.openInventory(player.getEnderChest());
36 | return;
37 | }
38 |
39 | Player target = Bukkit.getPlayer(args[0]);
40 |
41 | if (target == null) {
42 | player.sendMessage(ChatUtil.translate("&cPlayer '" + args[0] + "' not found."));
43 | return;
44 | }
45 |
46 | player.openInventory(target.getEnderChest());
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/profile/commands/KillStreakCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.profile.commands;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.chat.ChatUtil;
5 | import dev.panda.command.BaseCommand;
6 | import dev.panda.command.Command;
7 | import dev.panda.command.CommandArgs;
8 | import org.bukkit.entity.Player;
9 |
10 | public class KillStreakCommand extends BaseCommand {
11 |
12 | @Command(name = "killstreak", permission = "pandafly.killstreak")
13 | @Override
14 | public void onCommand(CommandArgs command) {
15 | Player player = command.getPlayer();
16 |
17 | ComboFly.get().getMainConfig().getStringList("KILLSTREAK.COMMAND").forEach(key -> player.sendMessage(ChatUtil.translate(key)));
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/profile/commands/balance/PayCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.profile.commands.balance;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.chat.ChatUtil;
5 | import dev.panda.combofly.utilities.Ints;
6 | import dev.panda.command.BaseCommand;
7 | import dev.panda.command.CommandArgs;
8 | import org.bukkit.Bukkit;
9 | import org.bukkit.entity.Player;
10 |
11 | public class PayCommand extends BaseCommand {
12 |
13 | @Override
14 | public void onCommand(CommandArgs command) {
15 | Player player = command.getPlayer();
16 | String[] args = command.getArgs();
17 | String label = command.getLabel();
18 |
19 | if (!player.hasPermission("pandafly.pay")) {
20 | player.hasPermission(ChatUtil.translate("&cYou don't have permission."));
21 | return;
22 | }
23 |
24 | if (args.length < 2) {
25 | player.sendMessage(ChatUtil.translate("&cUsage: /" + label + " "));
26 | return;
27 | }
28 |
29 | Player target = Bukkit.getPlayer(args[0]);
30 |
31 | if (target == null) {
32 | player.sendMessage(ChatUtil.translate("&cPlayer not found."));
33 | return;
34 | }
35 |
36 | if (player.equals(target)) {
37 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("BALANCE.PAY-SELF")));
38 | return;
39 | }
40 |
41 | Integer amount = Ints.tryParse(args[1]);
42 |
43 | if (amount == null) {
44 | player.sendMessage(ChatUtil.translate("&cAmount must be a number."));
45 | return;
46 | }
47 |
48 | if (amount <= 0) {
49 | player.sendMessage(ChatUtil.translate("&cAmount must be positive."));
50 | return;
51 | }
52 |
53 | int playerBalance = (int) ComboFly.get().getBalanceType().getBalance(player);
54 | int targetBalance = (int) ComboFly.get().getBalanceType().getBalance(target);
55 |
56 | if (playerBalance < amount) {
57 | ComboFly.get().getMainConfig().getStringList("PAY-ENOUGH-BALANCE").forEach(key -> player.sendMessage(key
58 | .replace("{amount}", String.valueOf(playerBalance))));
59 | return;
60 | }
61 |
62 | ComboFly.get().getBalanceType().setBalance(player, playerBalance - amount);
63 | ComboFly.get().getBalanceType().setBalance(target, targetBalance + amount);
64 | player.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("BALANCE.PAY-SEND")
65 | .replace("{amount}", String.valueOf(amount))
66 | .replace("{target}", target.getName())));
67 | target.sendMessage(ChatUtil.translate(ComboFly.get().getMessageConfig().getString("BALANCE.PAY-RECEIVE")
68 | .replace("{amount}", String.valueOf(amount))
69 | .replace("{player}", player.getName())));
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/profile/commands/leaderboard/LeaderboardCommand.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.profile.commands.leaderboard;
2 |
3 | import dev.panda.combofly.profile.commands.leaderboard.menu.LeaderboardMenu;
4 | import dev.panda.command.BaseCommand;
5 | import dev.panda.command.Command;
6 | import dev.panda.command.CommandArgs;
7 | import org.bukkit.entity.Player;
8 |
9 | public class LeaderboardCommand extends BaseCommand {
10 |
11 | @Command(name = "leaderboard", aliases = {"tops", "top", "topkills", "topdeaths"})
12 | @Override
13 | public void onCommand(CommandArgs commandArgs) {
14 | Player player = commandArgs.getPlayer();
15 |
16 | new LeaderboardMenu().openMenu(player);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/profile/commands/leaderboard/menu/LeaderboardMenu.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.profile.commands.leaderboard.menu;
2 |
3 | import com.google.common.collect.Lists;
4 | import com.google.common.collect.Maps;
5 | import dev.panda.chat.ChatUtil;
6 | import dev.panda.combofly.profile.Profile;
7 | import dev.panda.combofly.utilities.menu.Button;
8 | import dev.panda.combofly.utilities.menu.Menu;
9 | import dev.panda.item.ItemBuilder;
10 | import org.bukkit.Material;
11 | import org.bukkit.entity.Player;
12 | import org.bukkit.inventory.ItemStack;
13 |
14 | import java.util.List;
15 | import java.util.Map;
16 | import java.util.concurrent.atomic.AtomicInteger;
17 |
18 | public class LeaderboardMenu extends Menu {
19 |
20 | @Override
21 | public String getTitle(Player player) {
22 | return "&6&lLeaderboard";
23 | }
24 |
25 | @Override
26 | public int getSize() {
27 | return 9*3;
28 | }
29 |
30 | @Override
31 | public Map getButtons(Player player) {
32 | Map buttons = Maps.newHashMap();
33 | buttons.put(12, new KillsButton());
34 | buttons.put(14, new DeathsButton());
35 | return buttons;
36 | }
37 |
38 | private static class KillsButton extends Button {
39 |
40 | @Override
41 | public ItemStack getButtonItem(Player player) {
42 | List lore = Lists.newArrayList();
43 | lore.add(ChatUtil.NORMAL_LINE);
44 | AtomicInteger pos = new AtomicInteger(1);
45 | Profile.getLeaderboards().get("kills").stream().limit(10).forEach(profile ->
46 | lore.add(ChatUtil.translate("&7" + pos.getAndIncrement() + ") " + "&a" + profile.getName() + " &7(" + profile.getKd().getKills() + ")")));
47 | lore.add(ChatUtil.NORMAL_LINE);
48 | return new ItemBuilder(Material.EMERALD)
49 | .name("&2Top Kills")
50 | .lore(lore)
51 | .build();
52 | }
53 | }
54 |
55 | private static class DeathsButton extends Button {
56 |
57 | @Override
58 | public ItemStack getButtonItem(Player player) {
59 | List lore = Lists.newArrayList();
60 | lore.add(ChatUtil.NORMAL_LINE);
61 | AtomicInteger pos = new AtomicInteger(1);
62 | Profile.getLeaderboards().get("deaths").stream().limit(10).forEach(profile ->
63 | lore.add(ChatUtil.translate("&7" + pos.getAndIncrement() + ") " + "&a" + profile.getName() + " &7(" + profile.getKd().getDeaths() + ")")));
64 | lore.add(ChatUtil.NORMAL_LINE);
65 | return new ItemBuilder(Material.EMERALD)
66 | .name("&2Top Deaths")
67 | .lore(lore)
68 | .build();
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/profile/comparator/ProfileDeathsComparator.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.profile.comparator;
2 |
3 | import dev.panda.combofly.profile.Profile;
4 |
5 | import java.util.Comparator;
6 |
7 | public class ProfileDeathsComparator implements Comparator {
8 | @Override
9 | public int compare(Profile o1, Profile o2) {
10 | return Integer.compare(o1.getKd().getDeaths(), o2.getKd().getDeaths());
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/profile/comparator/ProfileKillsComparator.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.profile.comparator;
2 |
3 | import dev.panda.combofly.profile.Profile;
4 |
5 | import java.util.Comparator;
6 |
7 | public class ProfileKillsComparator implements Comparator {
8 | @Override
9 | public int compare(Profile o1, Profile o2) {
10 | return Integer.compare(o1.getKd().getKills(), o2.getKd().getKills());
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/profile/entry/KDEntry.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.profile.entry;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.Setter;
6 |
7 | @Getter @Setter
8 | @AllArgsConstructor
9 | public class KDEntry {
10 |
11 | private int kills, deaths;
12 |
13 | public void incrementKills() {
14 | this.kills += 1;
15 | }
16 |
17 | public void decrementKills(int amount) {
18 | this.kills -= amount;
19 | }
20 |
21 | public void incrementDeaths() {
22 | this.deaths += 1;
23 | }
24 |
25 | public void decrementDeaths(int amount) {
26 | this.deaths -= amount;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/Animation.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities;
2 |
3 | import dev.panda.combofly.ComboFly;
4 |
5 | import java.util.List;
6 | import java.util.concurrent.atomic.AtomicInteger;
7 |
8 | public class Animation {
9 |
10 | public static String title, footer;
11 |
12 | public static void init() {
13 | List titles = ComboFly.get().getScoreboardConfig().getStringList("TITLE");
14 | List footers = ComboFly.get().getScoreboardConfig().getStringList("FOOTER");
15 |
16 | title = titles.get(0);
17 | footer = footers.get(0);
18 |
19 | if (ComboFly.get().getScoreboardConfig().getBoolean("TITLE-ANIMATION-ENABLE")) {
20 | AtomicInteger atomicInteger = new AtomicInteger();
21 |
22 | ComboFly.get().getServer().getScheduler().runTaskTimerAsynchronously(ComboFly.get(), () -> {
23 | if (atomicInteger.get() == titles.size()) atomicInteger.set(0);
24 |
25 | title = titles.get(atomicInteger.getAndIncrement());
26 |
27 | }, 0L, (long) (ComboFly.get().getScoreboardConfig().getDouble("TITLE-TASK") * 20L));
28 | }
29 |
30 | if (ComboFly.get().getScoreboardConfig().getBoolean("FOOTER-ANIMATION-ENABLE")) {
31 | AtomicInteger atomicInteger = new AtomicInteger();
32 |
33 | ComboFly.get().getServer().getScheduler().runTaskTimerAsynchronously(ComboFly.get(), () -> {
34 | if (atomicInteger.get() == footers.size()) atomicInteger.set(0);
35 |
36 | footer = footers.get(atomicInteger.getAndIncrement());
37 |
38 | }, 0L, (long) (ComboFly.get().getScoreboardConfig().getDouble("FOOTER-TASK") * 20L));
39 | }
40 | }
41 |
42 | public static String getScoreboardTitle() {
43 | return title;
44 | }
45 |
46 | public static String getScoreboardFooter() {
47 | return footer;
48 | }
49 |
50 | }
51 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/Cooldown.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class Cooldown {
7 |
8 | private long start = System.currentTimeMillis();
9 | private long expire;
10 | private boolean notified;
11 |
12 | public Cooldown(long duration) {
13 | this.expire = this.start + duration;
14 |
15 | if (duration == 0) {
16 | this.notified = true;
17 | }
18 | }
19 |
20 | public long getPassed() {
21 | return System.currentTimeMillis() - this.start;
22 | }
23 |
24 | public long getRemaining() {
25 | return this.expire - System.currentTimeMillis();
26 | }
27 |
28 | public boolean hasExpired() {
29 | return System.currentTimeMillis() - this.expire >= 0;
30 | }
31 |
32 | public String getTimeLeft() {
33 | if (this.getRemaining() >= 60_000) {
34 | return TimeUtil.millisToRoundedTime(this.getRemaining());
35 | } else {
36 | return TimeUtil.millisToSeconds(this.getRemaining());
37 | }
38 | }
39 |
40 | }
41 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/Description.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities;
2 |
3 | import java.util.List;
4 |
5 | import dev.panda.combofly.ComboFly;
6 |
7 | public class Description {
8 |
9 | public static String getName() {
10 | return ComboFly.get().getDescription().getName();
11 | }
12 |
13 | public static String getVersion() {
14 | return ComboFly.get().getDescription().getVersion();
15 | }
16 |
17 | public static List getAuthors() {
18 | return ComboFly.get().getDescription().getAuthors();
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/Ints.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities;
2 |
3 | public class Ints {
4 |
5 | public static Integer tryParse(String string) {
6 | try {
7 | return Integer.parseInt(string);
8 | } catch (IllegalArgumentException ex) {
9 | return null;
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/LocationUtil.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities;
2 |
3 | import org.bukkit.Bukkit;
4 | import org.bukkit.Location;
5 | import org.bukkit.World;
6 |
7 | public class LocationUtil {
8 |
9 | public static Location[] getFaces(Location start) {
10 | Location[] faces = new Location[4];
11 | faces[0] = new Location(start.getWorld(), start.getX() + 1, start.getY(), start.getZ());
12 | faces[1] = new Location(start.getWorld(), start.getX() - 1, start.getY(), start.getZ());
13 | faces[2] = new Location(start.getWorld(), start.getX(), start.getY() + 1, start.getZ());
14 | faces[3] = new Location(start.getWorld(), start.getX(), start.getY() - 1, start.getZ());
15 | return faces;
16 | }
17 |
18 | public static String serialize(Location location) {
19 | if (location == null) {
20 | return "null";
21 | }
22 |
23 | return location.getWorld().getName() + ":" + location.getX() + ":" + location.getY() + ":" + location.getZ() +
24 | ":" + location.getYaw() + ":" + location.getPitch();
25 | }
26 |
27 | public static Location deserialize(String source) {
28 | if (source == null) {
29 | return null;
30 | }
31 |
32 | String[] split = source.split(":");
33 | World world = Bukkit.getServer().getWorld(split[0]);
34 |
35 | if (world == null) {
36 | return null;
37 | }
38 |
39 | return new Location(world, Double.parseDouble(split[1]), Double.parseDouble(split[2]), Double.parseDouble(split[3]), Float.parseFloat(split[4]), Float.parseFloat(split[5]));
40 | }
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/PlayerUtil.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities;
2 |
3 | import org.bukkit.Bukkit;
4 | import org.bukkit.GameMode;
5 | import org.bukkit.entity.Player;
6 | import org.bukkit.inventory.ItemStack;
7 | import org.bukkit.potion.PotionEffect;
8 | import org.bukkit.potion.PotionEffectType;
9 |
10 | import java.util.UUID;
11 |
12 | public class PlayerUtil {
13 |
14 | public static void reset(Player player) {
15 | reset(player, true);
16 | }
17 |
18 | public static void reset(Player player, boolean resetHeldSlot) {
19 | player.setHealth(20.0D);
20 | player.setSaturation(20.0F);
21 | player.setFallDistance(0.0F);
22 | player.setFoodLevel(20);
23 | player.setFireTicks(0);
24 | player.setMaximumNoDamageTicks(20);
25 | player.setExp(0.0F);
26 | player.setLevel(0);
27 | player.setAllowFlight(false);
28 | player.setFlying(false);
29 | player.spigot().setCollidesWithEntities(true);
30 | player.setGameMode(GameMode.SURVIVAL);
31 | player.getInventory().setArmorContents(new ItemStack[4]);
32 | player.getInventory().setContents(new ItemStack[36]);
33 | player.getActivePotionEffects().forEach(effect -> player.removePotionEffect(effect.getType()));
34 |
35 | if (resetHeldSlot) {
36 | player.getInventory().setHeldItemSlot(0);
37 | }
38 |
39 | player.updateInventory();
40 | }
41 |
42 | public static void denyMovement(Player player) {
43 | player.setFlying(false);
44 | player.setWalkSpeed(0.0F);
45 | player.setSprinting(false);
46 | player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, Integer.MAX_VALUE, 200));
47 | }
48 |
49 | public static void allowMovement(Player player) {
50 | player.setFlying(false);
51 | player.setWalkSpeed(0.2F);
52 | player.setFoodLevel(20);
53 | player.setSprinting(true);
54 | player.removePotionEffect(PotionEffectType.JUMP);
55 | }
56 |
57 | }
58 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/Time.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities;
2 |
3 | import org.apache.commons.lang.time.DurationFormatUtils;
4 |
5 | public class Time {
6 |
7 | public static String formatIntMin(int time) {
8 | return String.format("%02d:%02d", time / 60, time % 60);
9 | }
10 |
11 | public static String formatLongMin(long time) {
12 | long totalSecs = time / 1000L;
13 | return String.format("%02d:%02d", totalSecs / 60L, totalSecs % 60L);
14 | }
15 |
16 | public static String formatDuration(long input) {
17 | return DurationFormatUtils.formatDurationWords(input, true, true);
18 | }
19 |
20 | public static int format(String input) {
21 | if (input == null || input.isEmpty()) {
22 | return -1;
23 | }
24 | int result = 0;
25 | StringBuilder number = new StringBuilder();
26 | for (int i = 0; i < input.length(); ++i) {
27 | char c = input.charAt(i);
28 | if (Character.isDigit(c)) {
29 | number.append(c);
30 | } else {
31 | String str;
32 | if (Character.isLetter(c) && !(str = number.toString()).isEmpty()) {
33 | result += convert(Integer.parseInt(str), c);
34 | number = new StringBuilder();
35 | }
36 | }
37 | }
38 | return result;
39 | }
40 |
41 | private static int convert(int value, char unit) {
42 | switch (unit) {
43 | case 'h': {
44 | return value * 60 * 60;
45 | }
46 | case 'm': {
47 | return value * 60;
48 | }
49 | case 's': {
50 | return value;
51 | }
52 | default: {
53 | return -1;
54 | }
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/TimeUtil.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities;
2 |
3 | import java.sql.Timestamp;
4 | import java.text.DecimalFormat;
5 | import java.text.SimpleDateFormat;
6 | import java.util.Calendar;
7 | import java.util.Date;
8 | import java.util.regex.Matcher;
9 | import java.util.regex.Pattern;
10 |
11 | public final class TimeUtil {
12 |
13 | private static final String HOUR_FORMAT = "%02d:%02d:%02d";
14 | private static final String MINUTE_FORMAT = "%02d:%02d";
15 |
16 | private TimeUtil() {
17 | throw new RuntimeException("Cannot instantiate a utility class.");
18 | }
19 |
20 | public static String millisToTimer(long millis) {
21 | long seconds = millis / 1000L;
22 |
23 | if (seconds > 3600L) {
24 | return String.format(HOUR_FORMAT, seconds / 3600L, seconds % 3600L / 60L, seconds % 60L);
25 | } else {
26 | return String.format(MINUTE_FORMAT, seconds / 60L, seconds % 60L);
27 | }
28 | }
29 |
30 | /**
31 | * Return the amount of seconds from milliseconds.
32 | * Note: We explicitly use 1000.0F (float) instead of 1000L (long).
33 | *
34 | * @param millis the amount of time in milliseconds
35 | * @return the seconds
36 | */
37 | public static String millisToSeconds(long millis) {
38 | return new DecimalFormat("#0.0").format(millis / 1000.0F);
39 | }
40 |
41 | public static String dateToString(Date date, String secondaryColor) {
42 | Calendar calendar = Calendar.getInstance();
43 | calendar.setTime(date);
44 |
45 | return new SimpleDateFormat("MMM dd yyyy " + (secondaryColor == null ? "" : secondaryColor) +
46 | "(hh:mm aa zz)").format(date);
47 | }
48 |
49 | public static Timestamp addDuration(long duration) {
50 | return truncateTimestamp(new Timestamp(System.currentTimeMillis() + duration));
51 | }
52 |
53 | public static Timestamp truncateTimestamp(Timestamp timestamp) {
54 | if (timestamp.toLocalDateTime().getYear() > 2037) {
55 | timestamp.setYear(2037);
56 | }
57 |
58 | return timestamp;
59 | }
60 |
61 | public static Timestamp addDuration(Timestamp timestamp) {
62 | return truncateTimestamp(new Timestamp(System.currentTimeMillis() + timestamp.getTime()));
63 | }
64 |
65 | public static Timestamp fromMillis(long millis) {
66 | return new Timestamp(millis);
67 | }
68 |
69 | public static Timestamp getCurrentTimestamp() {
70 | return new Timestamp(System.currentTimeMillis());
71 | }
72 |
73 | public static String millisToRoundedTime(long millis) {
74 | millis += 1L;
75 |
76 | long seconds = millis / 1000L;
77 | long minutes = seconds / 60L;
78 | long hours = minutes / 60L;
79 | long days = hours / 24L;
80 | long weeks = days / 7L;
81 | long months = weeks / 4L;
82 | long years = months / 12L;
83 |
84 | if (years > 0) {
85 | return years + " year" + (years == 1 ? "" : "s");
86 | } else if (months > 0) {
87 | return months + " month" + (months == 1 ? "" : "s");
88 | } else if (weeks > 0) {
89 | return weeks + " week" + (weeks == 1 ? "" : "s");
90 | } else if (days > 0) {
91 | return days + " day" + (days == 1 ? "" : "s");
92 | } else if (hours > 0) {
93 | return hours + " hour" + (hours == 1 ? "" : "s");
94 | } else if (minutes > 0) {
95 | return minutes + " minute" + (minutes == 1 ? "" : "s");
96 | } else {
97 | return seconds + " second" + (seconds == 1 ? "" : "s");
98 | }
99 | }
100 |
101 | public static long parseTime(String time) {
102 | long totalTime = 0L;
103 | boolean found = false;
104 | Matcher matcher = Pattern.compile("\\d+\\D+").matcher(time);
105 |
106 | while (matcher.find()) {
107 | String s = matcher.group();
108 | Long value = Long.parseLong(s.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)")[0]);
109 | String type = s.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)")[1];
110 |
111 | switch (type) {
112 | case "s":
113 | totalTime += value;
114 | found = true;
115 | break;
116 | case "m":
117 | totalTime += value * 60;
118 | found = true;
119 | break;
120 | case "h":
121 | totalTime += value * 60 * 60;
122 | found = true;
123 | break;
124 | case "d":
125 | totalTime += value * 60 * 60 * 24;
126 | found = true;
127 | break;
128 | case "w":
129 | totalTime += value * 60 * 60 * 24 * 7;
130 | found = true;
131 | break;
132 | case "M":
133 | totalTime += value * 60 * 60 * 24 * 30;
134 | found = true;
135 | break;
136 | case "y":
137 | totalTime += value * 60 * 60 * 24 * 365;
138 | found = true;
139 | break;
140 | }
141 | }
142 |
143 | return !found ? -1 : totalTime * 1000;
144 | }
145 |
146 | }
147 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/Utils.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities;
2 |
3 | import com.google.common.base.Preconditions;
4 | import com.sk89q.worldedit.bukkit.WorldEditPlugin;
5 | import org.bukkit.Bukkit;
6 | import org.bukkit.Location;
7 | import org.bukkit.World;
8 | import org.bukkit.block.Block;
9 | import org.bukkit.entity.Player;
10 |
11 | import java.lang.reflect.Method;
12 | import java.util.Collection;
13 |
14 | public class Utils {
15 |
16 | public static WorldEditPlugin getWorldEdit() {
17 | return (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit");
18 | }
19 |
20 | public static Location getHighestLocation(Location origin) {
21 | return getHighestLocation(origin, null);
22 | }
23 |
24 | public static Location getHighestLocation(Location origin, Location def) {
25 | Preconditions.checkNotNull(origin, "The location cannot be null");
26 | Location cloned = origin.clone();
27 | World world = cloned.getWorld();
28 |
29 | int x = cloned.getBlockX();
30 | int y = world.getMaxHeight();
31 | int z = cloned.getBlockZ();
32 |
33 | while (y > origin.getBlockY()) {
34 | Block block = world.getBlockAt(x, --y, z);
35 | if (!block.isEmpty()) {
36 | Location next = block.getLocation();
37 | next.setPitch(origin.getPitch());
38 | next.setYaw(origin.getYaw());
39 | return next;
40 | }
41 | }
42 | return def;
43 | }
44 |
45 | public static int getPlayerPing(Player player) {
46 | try {
47 | String a = Bukkit.getServer().getClass().getPackage().getName().substring(23);
48 | Class> b = Class.forName("org.bukkit.craftbukkit." + a + ".entity.CraftPlayer");
49 | Object c = b.getMethod("getHandle").invoke(player);
50 | return (int) c.getClass().getDeclaredField("ping").get(c);
51 | }
52 | catch (Exception e) {
53 | return 0;
54 | }
55 | }
56 |
57 | public static int getPlayersAmount() {
58 | try {
59 | Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers");
60 | return onlinePlayersMethod.getReturnType().equals(Collection.class) ?
61 | ((Collection>) onlinePlayersMethod.invoke(Bukkit.getServer())).size()
62 | : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length;
63 | } catch (Exception ignore) {
64 | return 0;
65 | }
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/hooks/PandaAbilityHook.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.hooks;
2 |
3 | import dev.panda.ability.PandaAbilityAPI;
4 | import lombok.Getter;
5 | import lombok.Setter;
6 | import lombok.experimental.UtilityClass;
7 |
8 | /**
9 | * Created by Risas
10 | * Project: PandaFly
11 | * Date: 08-11-2021 - 13:37
12 | * Twitter: @RisasDev
13 | * GitHub: https://github.com/RisasDev
14 | */
15 |
16 | @UtilityClass
17 | public class PandaAbilityHook {
18 |
19 | @Getter @Setter
20 | private boolean pandaAbility;
21 |
22 | @Getter @Setter
23 | private PandaAbilityAPI pandaAbilityAPI;
24 |
25 |
26 | public void init() {
27 | setPandaAbility(true);
28 | setPandaAbilityAPI(new PandaAbilityAPI());
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/hooks/PlaceholderAPIHook.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.hooks;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import dev.panda.combofly.profile.Profile;
5 | import me.clip.placeholderapi.expansion.PlaceholderExpansion;
6 | import org.bukkit.entity.Player;
7 |
8 | /**
9 | * Created by Risas
10 | * Project: PandaFly
11 | * Date: 08-11-2021 - 13:36
12 | * Twitter: @RisasDev
13 | * GitHub: https://github.com/RisasDev
14 | */
15 | public class PlaceholderAPIHook extends PlaceholderExpansion {
16 |
17 | private final ComboFly plugin;
18 |
19 | public PlaceholderAPIHook(ComboFly plugin) {
20 | this.plugin = plugin;
21 | }
22 |
23 | @Override
24 | public boolean persist(){
25 | return true;
26 | }
27 |
28 | @Override
29 | public boolean canRegister(){
30 | return true;
31 | }
32 |
33 | @Override
34 | public String getAuthor(){
35 | return "Aleesk, TulioTriste, Risas";
36 | }
37 |
38 | @Override
39 | public String getIdentifier(){
40 | return "PandaFly";
41 | }
42 |
43 | @Override
44 | public String getVersion(){
45 | return plugin.getDescription().getVersion();
46 | }
47 |
48 | @Override
49 | public String onPlaceholderRequest(Player player, String identifier) {
50 | if (player == null) return "";
51 |
52 | switch (identifier) {
53 | case "kills": return String.valueOf(Profile.getProfiles().get(player.getUniqueId()).getKd().getKills());
54 | case "deaths": return String.valueOf(Profile.getProfiles().get(player.getUniqueId()).getKd().getDeaths());
55 | case "balance": return String.valueOf(Profile.getProfiles().get(player.getUniqueId()).getBalance());
56 | default: return null;
57 | }
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/menu/Button.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.menu;
2 |
3 | import dev.panda.item.ItemBuilder;
4 | import org.bukkit.Material;
5 | import org.bukkit.Sound;
6 | import org.bukkit.entity.Player;
7 | import org.bukkit.event.inventory.ClickType;
8 | import org.bukkit.inventory.ItemStack;
9 |
10 | public abstract class Button {
11 |
12 | public static Button placeholder(Material material, final int data, String title) {
13 | return (new Button() {
14 | public ItemStack getButtonItem(Player player) {
15 | return new ItemBuilder(material)
16 | .data(data)
17 | .name(title)
18 | .build();
19 | }
20 | });
21 | }
22 |
23 | public static void playFail(Player player) {
24 | player.playSound(player.getLocation(), Sound.DIG_GRASS, 20F, 0.1F);
25 |
26 | }
27 |
28 | public static void playSuccess(Player player) {
29 | player.playSound(player.getLocation(), Sound.NOTE_PIANO, 20F, 15F);
30 | }
31 |
32 | public static void playNeutral(Player player) {
33 | player.playSound(player.getLocation(), Sound.CLICK, 20F, 1F);
34 | }
35 |
36 | public abstract ItemStack getButtonItem(Player player);
37 |
38 | public void clicked(Player player, int slot, ClickType clickType, int hotbarButton) {
39 |
40 | }
41 |
42 | public boolean shouldUpdate(Player player, int slot, ClickType clickType) {
43 | return false;
44 | }
45 |
46 | public boolean shouldCancel(Player player, int slot, ClickType clickType) {
47 | return true;
48 | }
49 |
50 | public boolean shouldShift(Player player, int slot, ClickType clickType) {
51 | return true;
52 | }
53 | }
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/menu/ButtonListener.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.menu;
2 |
3 | import dev.panda.combofly.ComboFly;
4 | import org.bukkit.Bukkit;
5 | import org.bukkit.entity.Player;
6 | import org.bukkit.event.EventHandler;
7 | import org.bukkit.event.EventPriority;
8 | import org.bukkit.event.Listener;
9 | import org.bukkit.event.inventory.ClickType;
10 | import org.bukkit.event.inventory.InventoryClickEvent;
11 | import org.bukkit.event.inventory.InventoryCloseEvent;
12 |
13 | public class ButtonListener implements Listener {
14 |
15 | public ButtonListener() {
16 | Bukkit.getPluginManager().registerEvents(this, ComboFly.get());
17 | }
18 |
19 | @EventHandler(priority = EventPriority.HIGHEST)
20 | public void onButtonPress(InventoryClickEvent event) {
21 | Player player = (Player) event.getWhoClicked();
22 |
23 | Menu openMenu = Menu.currentlyOpenedMenus.get(player.getName());
24 |
25 | if (openMenu != null) {
26 | if (event.getSlot() != event.getRawSlot()) {
27 | if ((event.getClick() == ClickType.SHIFT_LEFT || event.getClick() == ClickType.SHIFT_RIGHT)) {
28 | event.setCancelled(false);
29 | }
30 | return;
31 | }
32 |
33 | if (openMenu.getButtons().containsKey(event.getSlot())) {
34 | Button button = openMenu.getButtons().get(event.getSlot());
35 | boolean shouldCancel = button.shouldCancel(player, event.getSlot(), event.getClick());
36 | boolean shouldShift = button.shouldShift(player, event.getSlot(), event.getClick());
37 |
38 | if (shouldCancel && shouldShift) {
39 | event.setCancelled(true);
40 | }
41 | else {
42 | event.setCancelled(shouldCancel);
43 | }
44 |
45 | button.clicked(player, event.getSlot(), event.getClick(), event.getHotbarButton());
46 |
47 | if (Menu.currentlyOpenedMenus.containsKey(player.getName())) {
48 | Menu newMenu = Menu.currentlyOpenedMenus.get(player.getName());
49 | if (newMenu == openMenu) {
50 | if (openMenu.isUpdateAfterClick()) {
51 | openMenu.setClosedByMenu(true);
52 | newMenu.openMenu(player);
53 | }
54 | }
55 | }
56 | else if (button.shouldUpdate(player, event.getSlot(), event.getClick())) {
57 | openMenu.setClosedByMenu(true);
58 | openMenu.openMenu(player);
59 | }
60 | }
61 | }
62 | }
63 |
64 | @EventHandler(priority = EventPriority.HIGH)
65 | public void onInventoryClose(InventoryCloseEvent event) {
66 | Player player = (Player) event.getPlayer();
67 | Menu openMenu = Menu.currentlyOpenedMenus.get(player.getName());
68 |
69 | if (openMenu != null) {
70 | Menu.currentlyOpenedMenus.remove(player.getName());
71 | }
72 | }
73 | }
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/menu/Menu.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.menu;
2 |
3 | import dev.panda.chat.ChatUtil;
4 | import dev.panda.item.ItemBuilder;
5 | import lombok.Getter;
6 | import lombok.Setter;
7 | import org.bukkit.Bukkit;
8 | import org.bukkit.Material;
9 | import org.bukkit.entity.Player;
10 | import org.bukkit.inventory.Inventory;
11 | import org.bukkit.inventory.ItemStack;
12 |
13 | import java.util.HashMap;
14 | import java.util.Map;
15 |
16 | @Getter @Setter
17 | public abstract class Menu {
18 |
19 | public static Map currentlyOpenedMenus = new HashMap<>();
20 | @Getter private Map buttons = new HashMap<>();
21 | private boolean autoUpdate = false;
22 | private boolean updateAfterClick = true;
23 | private boolean closedByMenu = false;
24 | private boolean placeholder = false;
25 | private Button placeholderButton = Button.placeholder(Material.STAINED_GLASS_PANE, 7, " ");
26 |
27 | private ItemStack createItemStack(Player player, Button button) {
28 | return new ItemBuilder(button.getButtonItem(player)).build();
29 | }
30 |
31 | public void openMenu(final Player player) {
32 | this.buttons = this.getButtons(player);
33 |
34 | Menu previousMenu = Menu.currentlyOpenedMenus.get(player.getName());
35 | Inventory inventory = null;
36 | String title = ChatUtil.translate(this.getTitle(player));
37 | int size = this.getSize() == -1 ? this.size(this.buttons) : this.getSize();
38 | boolean update = false;
39 |
40 | if (title.length() > 32) {
41 | title = title.substring(0, 32);
42 | }
43 |
44 | if (player.getOpenInventory() != null) {
45 | if (previousMenu == null) {
46 | player.closeInventory();
47 | }
48 | else {
49 | int previousSize = player.getOpenInventory().getTopInventory().getSize();
50 |
51 | if (previousSize == size && player.getOpenInventory().getTopInventory().getTitle().equals(title)) {
52 | inventory = player.getOpenInventory().getTopInventory();
53 | update = true;
54 | }
55 | else {
56 | previousMenu.setClosedByMenu(true);
57 | player.closeInventory();
58 | }
59 | }
60 | }
61 |
62 | if (inventory == null) {
63 | inventory = Bukkit.createInventory(player, size, title);
64 | }
65 |
66 | inventory.setContents(new ItemStack[inventory.getSize()]);
67 |
68 | currentlyOpenedMenus.put(player.getName(), this);
69 |
70 | for (Map.Entry buttonEntry : this.buttons.entrySet()) {
71 | inventory.setItem(buttonEntry.getKey(), createItemStack(player, buttonEntry.getValue()));
72 | }
73 |
74 | if (this.isPlaceholder()) {
75 | Button fillButton = this.getPlaceholderButton() == null ? placeholderButton : this.getPlaceholderButton();
76 |
77 | for (int index = 0; index < size; index++) {
78 | if (this.buttons.get(index) == null) {
79 | this.buttons.put(index, fillButton);
80 | inventory.setItem(index, fillButton.getButtonItem(player));
81 | }
82 | }
83 | }
84 |
85 | if (update) {
86 | player.updateInventory();
87 | }
88 | else {
89 | player.openInventory(inventory);
90 | }
91 |
92 | this.setClosedByMenu(false);
93 | }
94 |
95 | public int size(Map buttons) {
96 | int highest = 0;
97 |
98 | for (int buttonValue : buttons.keySet()) {
99 | if (buttonValue > highest) {
100 | highest = buttonValue;
101 | }
102 | }
103 |
104 | return (int) (Math.ceil((highest + 1) / 9D) * 9D);
105 | }
106 |
107 | public int getSlot(int x, int y) {
108 | return ((9 * y) + x);
109 | }
110 |
111 | public int getSize() {
112 | return -1;
113 | }
114 |
115 | public Button getPlaceholderButton() {
116 | return null;
117 | }
118 |
119 | public abstract String getTitle(Player player);
120 |
121 | public abstract Map getButtons(Player player);
122 | }
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/menu/buttons/AirButton.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.menu.buttons;
2 |
3 | import dev.panda.combofly.utilities.menu.Button;
4 | import dev.panda.item.ItemBuilder;
5 | import org.bukkit.Material;
6 | import org.bukkit.entity.Player;
7 | import org.bukkit.event.inventory.ClickType;
8 | import org.bukkit.inventory.ItemStack;
9 |
10 | public class AirButton extends Button {
11 |
12 | @Override
13 | public ItemStack getButtonItem(Player player) {
14 | return new ItemBuilder(Material.AIR).build();
15 | }
16 |
17 | @Override
18 | public boolean shouldCancel(Player player, int slot, ClickType clickType) {
19 | return true;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/menu/buttons/BackButton.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.menu.buttons;
2 |
3 | import dev.panda.combofly.utilities.menu.Button;
4 | import dev.panda.combofly.utilities.menu.Menu;
5 | import dev.panda.item.ItemBuilder;
6 | import lombok.AllArgsConstructor;
7 | import org.bukkit.Material;
8 | import org.bukkit.entity.Player;
9 | import org.bukkit.event.inventory.ClickType;
10 | import org.bukkit.inventory.ItemStack;
11 |
12 | @AllArgsConstructor
13 | public class BackButton extends Button {
14 |
15 | private final Menu back;
16 |
17 | @Override
18 | public ItemStack getButtonItem(Player player) {
19 | return new ItemBuilder(Material.REDSTONE)
20 | .name("&c&lBack")
21 | .lore(
22 | "&cClick here to return",
23 | "&cto the previous menu."
24 | )
25 | .build();
26 | }
27 |
28 | @Override
29 | public void clicked(Player player, int i, ClickType clickType, int hb) {
30 | Button.playNeutral(player);
31 | this.back.openMenu(player);
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/menu/buttons/CloseButton.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.menu.buttons;
2 |
3 | import dev.panda.combofly.utilities.menu.Button;
4 | import dev.panda.item.ItemBuilder;
5 | import org.bukkit.Material;
6 | import org.bukkit.entity.Player;
7 | import org.bukkit.event.inventory.ClickType;
8 | import org.bukkit.inventory.ItemStack;
9 |
10 | public class CloseButton extends Button {
11 |
12 | @Override
13 | public ItemStack getButtonItem(Player player) {
14 | return new ItemBuilder(Material.INK_SACK)
15 | .data(1)
16 | .name("&cClose")
17 | .build();
18 | }
19 |
20 | @Override
21 | public void clicked(Player player, int i, ClickType clickType, int hb) {
22 | playNeutral(player);
23 | player.closeInventory();
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/menu/buttons/PageInfoButton.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.menu.buttons;
2 |
3 | import dev.panda.combofly.utilities.menu.Button;
4 | import dev.panda.combofly.utilities.menu.pagination.PaginatedMenu;
5 | import dev.panda.item.ItemBuilder;
6 | import lombok.AllArgsConstructor;
7 | import org.bukkit.Material;
8 | import org.bukkit.entity.Player;
9 | import org.bukkit.event.inventory.ClickType;
10 | import org.bukkit.inventory.ItemStack;
11 |
12 | @AllArgsConstructor
13 | public class PageInfoButton extends Button {
14 |
15 | private final PaginatedMenu paginatedMenu;
16 |
17 | @Override
18 | public ItemStack getButtonItem(Player player) {
19 | return new ItemBuilder(Material.NETHER_STAR)
20 | .name("&ePage Info")
21 | .lore("&e" + paginatedMenu.getPage() + "&7/&a" + paginatedMenu.getPages(player))
22 | .build();
23 | }
24 |
25 | @Override
26 | public boolean shouldCancel(Player player, int slot, ClickType clickType) {
27 | return true;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/menu/pagination/JumpToPageButton.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.menu.pagination;
2 |
3 | import dev.panda.chat.ChatUtil;
4 | import dev.panda.combofly.utilities.menu.Button;
5 | import dev.panda.item.ItemBuilder;
6 | import lombok.AllArgsConstructor;
7 | import org.bukkit.Material;
8 | import org.bukkit.entity.Player;
9 | import org.bukkit.event.inventory.ClickType;
10 | import org.bukkit.inventory.ItemStack;
11 |
12 | @AllArgsConstructor
13 | public class JumpToPageButton extends Button {
14 |
15 | private final int page;
16 | private final PaginatedMenu menu;
17 | private final boolean current;
18 |
19 | @Override
20 | public ItemStack getButtonItem(Player player) {
21 | ItemBuilder itemBuilder = new ItemBuilder(this.current ? Material.ENCHANTED_BOOK : Material.BOOK, this.page);
22 | itemBuilder.name(ChatUtil.translate("&cPage " + this.page));
23 |
24 | if (this.current) {
25 | itemBuilder.lore(
26 | "",
27 | ChatUtil.translate("&aCurrent page")
28 | );
29 | }
30 |
31 | return itemBuilder.build();
32 | }
33 |
34 | @Override
35 | public void clicked(Player player, int i, ClickType clickType, int hb) {
36 | this.menu.modPage(player, this.page - this.menu.getPage());
37 | Button.playNeutral(player);
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/menu/pagination/PageButton.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.menu.pagination;
2 |
3 | import dev.panda.combofly.utilities.menu.Button;
4 | import dev.panda.item.ItemBuilder;
5 | import lombok.AllArgsConstructor;
6 | import org.bukkit.Material;
7 | import org.bukkit.entity.Player;
8 | import org.bukkit.event.inventory.ClickType;
9 | import org.bukkit.inventory.ItemStack;
10 |
11 | @AllArgsConstructor
12 | public class PageButton extends Button {
13 |
14 | private final int mod;
15 | private final PaginatedMenu menu;
16 |
17 | @Override
18 | public ItemStack getButtonItem(Player player) {
19 | ItemBuilder itemBuilder = new ItemBuilder(Material.CARPET);
20 |
21 | if (mod > 0) {
22 | itemBuilder.data((short) 13);
23 | }
24 | else {
25 | itemBuilder.data((short) 14);
26 | }
27 |
28 | if (this.hasNext(player)) {
29 | itemBuilder.name(this.mod > 0 ? "&aNext page" : "&cPrevious page");
30 | }
31 | else {
32 | itemBuilder.name("&7" + (this.mod > 0 ? "Last page" : "First page"));
33 | }
34 |
35 | return itemBuilder.build();
36 | }
37 |
38 | @Override
39 | public void clicked(Player player, int i, ClickType clickType, int hb) {
40 | if (hasNext(player)) {
41 | this.menu.modPage(player, this.mod);
42 | Button.playNeutral(player);
43 | } else {
44 | Button.playFail(player);
45 | }
46 | }
47 |
48 | private boolean hasNext(Player player) {
49 | int pg = this.menu.getPage() + this.mod;
50 | return pg > 0 && this.menu.getPages(player) >= pg;
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/menu/pagination/PaginatedMenu.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.menu.pagination;
2 |
3 | import dev.panda.combofly.utilities.menu.Button;
4 | import dev.panda.combofly.utilities.menu.Menu;
5 | import lombok.Getter;
6 | import org.bukkit.entity.Player;
7 |
8 | import java.util.HashMap;
9 | import java.util.Map;
10 |
11 | public abstract class PaginatedMenu extends Menu {
12 |
13 | @Getter
14 | private int page = 1;
15 |
16 | {
17 | setUpdateAfterClick(false);
18 | }
19 |
20 | @Override
21 | public String getTitle(Player player) {
22 | return getPrePaginatedTitle(player) + " - " + page + "/" + getPages(player);
23 | }
24 |
25 | public final void modPage(Player player, int mod) {
26 | page += mod;
27 | getButtons().clear();
28 | openMenu(player);
29 | }
30 |
31 | public final int getPages(Player player) {
32 | int buttonAmount = getAllPagesButtons(player).size();
33 |
34 | if (buttonAmount == 0) {
35 | return 1;
36 | }
37 |
38 | return (int) Math.ceil(buttonAmount / (double) getMaxItemsPerPage(player));
39 | }
40 |
41 | @Override
42 | public final Map getButtons(Player player) {
43 | int minIndex = (int) ((double) (page - 1) * getMaxItemsPerPage(player));
44 | int maxIndex = (int) ((double) (page) * getMaxItemsPerPage(player));
45 |
46 | HashMap buttons = new HashMap<>();
47 |
48 | for (Map.Entry entry : getAllPagesButtons(player).entrySet()) {
49 | int ind = entry.getKey();
50 |
51 | if (ind >= minIndex && ind < maxIndex) {
52 | ind -= (int) ((double) (getMaxItemsPerPage(player)) * (page - 1));
53 | buttons.put(ind, entry.getValue());
54 | }
55 | }
56 |
57 | Map global = getGlobalButtons(player);
58 |
59 | if (global != null) {
60 | buttons.putAll(global);
61 | }
62 |
63 | return buttons;
64 | }
65 |
66 | public int getMaxItemsPerPage(Player player) {
67 | return 18;
68 | }
69 |
70 | public Map getGlobalButtons(Player player) {
71 | return null;
72 | }
73 |
74 | public abstract String getPrePaginatedTitle(Player player);
75 |
76 | public abstract Map getAllPagesButtons(Player player);
77 | }
78 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/menu/pagination/ViewAllPagesMenu.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.menu.pagination;
2 |
3 | import dev.panda.combofly.utilities.menu.Button;
4 | import dev.panda.combofly.utilities.menu.Menu;
5 | import dev.panda.combofly.utilities.menu.buttons.BackButton;
6 | import lombok.Getter;
7 | import org.bukkit.entity.Player;
8 |
9 | import java.util.HashMap;
10 | import java.util.Map;
11 |
12 | public class ViewAllPagesMenu extends Menu {
13 |
14 | @Getter PaginatedMenu menu;
15 |
16 | @Override
17 | public String getTitle(Player player) {
18 | return "Jump to page";
19 | }
20 |
21 | @Override
22 | public Map getButtons(Player player) {
23 | HashMap buttons = new HashMap<>();
24 |
25 | buttons.put(0, new BackButton(menu));
26 |
27 | int index = 10;
28 |
29 | for (int i = 1; i <= menu.getPages(player); i++) {
30 | buttons.put(index++, new JumpToPageButton(i, menu, menu.getPage() == i));
31 |
32 | if ((index - 8) % 9 == 0) {
33 | index += 2;
34 | }
35 | }
36 |
37 | return buttons;
38 | }
39 |
40 | @Override
41 | public boolean isAutoUpdate() {
42 | return true;
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/scoreboard/Assemble.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.scoreboard;
2 |
3 | import java.util.Map;
4 | import java.util.UUID;
5 | import java.util.concurrent.ConcurrentHashMap;
6 |
7 | import dev.panda.combofly.utilities.scoreboard.events.AssembleBoardCreateEvent;
8 | import lombok.Getter;
9 | import lombok.Setter;
10 |
11 | import org.bukkit.Bukkit;
12 | import org.bukkit.entity.Player;
13 | import org.bukkit.event.HandlerList;
14 | import org.bukkit.plugin.java.JavaPlugin;
15 |
16 | @Getter @Setter
17 | public class Assemble {
18 |
19 | private JavaPlugin plugin;
20 | private AssembleAdapter adapter;
21 | private Map boards;
22 | private AssembleThread thread;
23 | private AssembleListener listeners;
24 | private long ticks = 2;
25 | private boolean hook = false;
26 | private AssembleStyle assembleStyle = AssembleStyle.KOHI;
27 |
28 | public Assemble(JavaPlugin plugin, AssembleAdapter adapter) {
29 | if (plugin == null) {
30 | throw new RuntimeException("Assemble can not be instantiated without a plugin instance!");
31 | }
32 |
33 | this.plugin = plugin;
34 | this.adapter = adapter;
35 | this.boards = new ConcurrentHashMap<>();
36 |
37 | this.setup();
38 | }
39 |
40 | public void setup() {
41 | listeners = new AssembleListener(this);
42 |
43 | //Register Events
44 | this.plugin.getServer().getPluginManager().registerEvents(listeners, this.plugin);
45 |
46 | //Ensure that the thread has stopped running
47 | if (this.thread != null) {
48 | this.thread.stop();
49 | this.thread = null;
50 | }
51 |
52 | //Register new boards for existing online players
53 | for (Player player : Bukkit.getOnlinePlayers()) {
54 | //Make sure it doesn't double up
55 | AssembleBoardCreateEvent createEvent = new AssembleBoardCreateEvent(player);
56 |
57 | Bukkit.getPluginManager().callEvent(createEvent);
58 | if (createEvent.isCancelled()) {
59 | return;
60 | }
61 |
62 | getBoards().put(player.getUniqueId(), new AssembleBoard(player, this));
63 | }
64 |
65 | //Start Thread
66 | this.thread = new AssembleThread(this);
67 | }
68 |
69 | public void cleanup() {
70 | if (this.thread != null) {
71 | this.thread.stop();
72 | this.thread = null;
73 | }
74 |
75 | if (listeners != null) {
76 | HandlerList.unregisterAll(listeners);
77 | listeners = null;
78 | }
79 |
80 | for (UUID uuid : getBoards().keySet()) {
81 | Player player = Bukkit.getPlayer(uuid);
82 | getBoards().remove(uuid);
83 | player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
84 | }
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/scoreboard/AssembleAdapter.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.scoreboard;
2 |
3 | import java.util.List;
4 | import org.bukkit.entity.Player;
5 |
6 | public interface AssembleAdapter {
7 |
8 | String getTitle(Player player);
9 |
10 | List getLines(Player player);
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/scoreboard/AssembleBoard.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.scoreboard;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 | import java.util.UUID;
6 | import java.util.concurrent.ThreadLocalRandom;
7 |
8 | import dev.panda.combofly.utilities.scoreboard.events.AssembleBoardCreatedEvent;
9 | import lombok.Getter;
10 | import org.bukkit.Bukkit;
11 | import org.bukkit.ChatColor;
12 | import org.bukkit.entity.Player;
13 | import org.bukkit.scoreboard.DisplaySlot;
14 | import org.bukkit.scoreboard.Objective;
15 | import org.bukkit.scoreboard.Scoreboard;
16 |
17 | @Getter
18 | public class AssembleBoard {
19 |
20 | // We assign a unique identifier (random string of ChatColor values)
21 | // to each board entry to: bypass the 32 char limit, using
22 | // a team's prefix & suffix and a team entry's display name, and to
23 | // track the order of entries;
24 | private final List entries = new ArrayList<>();
25 | private final List identifiers = new ArrayList<>();
26 | private Scoreboard scoreboard;
27 | private Objective objective;
28 | private UUID uuid;
29 |
30 | private Assemble assemble;
31 |
32 | public AssembleBoard(Player player, Assemble assemble) {
33 | this.assemble = assemble;
34 | this.setup(player);
35 | this.uuid = player.getUniqueId();
36 | }
37 |
38 | private void setup(Player player) {
39 | // Register new scoreboard if needed
40 | if (getAssemble().isHook() || !(player.getScoreboard() == Bukkit.getScoreboardManager().getMainScoreboard())) {
41 | this.scoreboard = player.getScoreboard();
42 | } else {
43 | this.scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
44 | }
45 |
46 | // Setup sidebar objective
47 | this.objective = this.scoreboard.registerNewObjective("Default", "dummy");
48 | this.objective.setDisplaySlot(DisplaySlot.SIDEBAR);
49 | this.objective.setDisplayName(getAssemble().getAdapter().getTitle(player));
50 |
51 | // Update scoreboard
52 | player.setScoreboard(this.scoreboard);
53 |
54 | //Send Update
55 | AssembleBoardCreatedEvent createdEvent = new AssembleBoardCreatedEvent(this);
56 | Bukkit.getPluginManager().callEvent(createdEvent);
57 | }
58 |
59 | public AssembleBoardEntry getEntryAtPosition(int pos) {
60 | if (pos >= this.entries.size()) {
61 | return null;
62 | } else {
63 | return this.entries.get(pos);
64 | }
65 | }
66 |
67 | public String getUniqueIdentifier(String text) {
68 | String identifier = getRandomChatColor() + ChatColor.WHITE;
69 |
70 | while (this.identifiers.contains(identifier)) {
71 | identifier = identifier + getRandomChatColor() + ChatColor.WHITE;
72 | }
73 |
74 | // This is rare, but just in case, make the method recursive
75 | if (identifier.length() > 16) {
76 | return this.getUniqueIdentifier(text);
77 | }
78 |
79 | // Add our identifier to the list so there are no duplicates
80 | this.identifiers.add(identifier);
81 |
82 | return identifier;
83 | }
84 |
85 | // Gets a random ChatColor and returns the String value of it
86 | private static String getRandomChatColor() {
87 | return ChatColor.values()[ThreadLocalRandom.current().nextInt(ChatColor.values().length)].toString();
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/scoreboard/AssembleBoardEntry.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.scoreboard;
2 |
3 | import lombok.Setter;
4 | import org.bukkit.ChatColor;
5 | import org.bukkit.scoreboard.Score;
6 | import org.bukkit.scoreboard.Scoreboard;
7 | import org.bukkit.scoreboard.Team;
8 |
9 | public class AssembleBoardEntry {
10 |
11 | private final AssembleBoard board;
12 | @Setter private String text, identifier;
13 | private Team team;
14 |
15 | public AssembleBoardEntry(AssembleBoard board, String text) {
16 | this.board = board;
17 | this.text = text;
18 | this.identifier = this.board.getUniqueIdentifier(text);
19 |
20 | this.setup();
21 | }
22 |
23 | public void setup() {
24 | final Scoreboard scoreboard = this.board.getScoreboard();
25 |
26 | if (scoreboard == null) {
27 | return;
28 | }
29 |
30 |
31 | String teamName = this.identifier;
32 |
33 | // This shouldn't happen, but just in case
34 | if (teamName.length() > 16) {
35 | teamName = teamName.substring(0, 16);
36 | }
37 |
38 | Team team = scoreboard.getTeam(teamName);
39 |
40 | // Register the team if it does not exist
41 | if (team == null) {
42 | team = scoreboard.registerNewTeam(teamName);
43 | }
44 |
45 | // Add the entry to the team
46 | if (!team.getEntries().contains(this.identifier)) {
47 | team.addEntry(this.identifier);
48 | }
49 |
50 | // Add the entry if it does not exist
51 | if (!this.board.getEntries().contains(this)) {
52 | this.board.getEntries().add(this);
53 | }
54 |
55 | this.team = team;
56 | }
57 |
58 | public void send(int position) {
59 | if (this.text.length() > 16) {
60 | String prefix = this.text.substring(0, 16);
61 | String suffix;
62 |
63 | if (prefix.charAt(15) == ChatColor.COLOR_CHAR) {
64 | prefix = prefix.substring(0, 15);
65 | suffix = this.text.substring(15, this.text.length());
66 | } else if (prefix.charAt(14) == ChatColor.COLOR_CHAR) {
67 | prefix = prefix.substring(0, 14);
68 | suffix = this.text.substring(14, this.text.length());
69 | } else {
70 | if (ChatColor.getLastColors(prefix).equalsIgnoreCase(ChatColor.getLastColors(this.identifier))) {
71 | suffix = this.text.substring(16, this.text.length());
72 | } else {
73 | suffix = ChatColor.getLastColors(prefix) + this.text.substring(16, this.text.length());
74 | }
75 | }
76 |
77 | if (suffix.length() > 16) {
78 | suffix = suffix.substring(0, 16);
79 | }
80 |
81 | this.team.setPrefix(prefix);
82 | this.team.setSuffix(suffix);
83 | } else {
84 | this.team.setPrefix(this.text);
85 | this.team.setSuffix("");
86 | }
87 |
88 | Score score = this.board.getObjective().getScore(this.identifier);
89 | score.setScore(position);
90 | }
91 |
92 | public void remove() {
93 | this.board.getIdentifiers().remove(this.identifier);
94 | this.board.getScoreboard().resetScores(this.identifier);
95 | }
96 |
97 | }
98 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/scoreboard/AssembleListener.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.scoreboard;
2 |
3 | import dev.panda.combofly.utilities.scoreboard.events.AssembleBoardCreateEvent;
4 | import dev.panda.combofly.utilities.scoreboard.events.AssembleBoardDestroyEvent;
5 | import lombok.Getter;
6 | import org.bukkit.Bukkit;
7 | import org.bukkit.event.EventHandler;
8 | import org.bukkit.event.Listener;
9 | import org.bukkit.event.player.PlayerJoinEvent;
10 | import org.bukkit.event.player.PlayerQuitEvent;
11 |
12 | @Getter
13 | public class AssembleListener implements Listener {
14 |
15 | private final Assemble assemble;
16 |
17 | public AssembleListener(Assemble assemble) {
18 | this.assemble = assemble;
19 | }
20 |
21 | @EventHandler
22 | public void onPlayerJoin(PlayerJoinEvent event) {
23 | AssembleBoardCreateEvent createEvent = new AssembleBoardCreateEvent(event.getPlayer());
24 |
25 | Bukkit.getPluginManager().callEvent(createEvent);
26 | if (createEvent.isCancelled()) {
27 | return;
28 | }
29 |
30 | getAssemble().getBoards().put(event.getPlayer().getUniqueId(), new AssembleBoard(event.getPlayer(), getAssemble()));
31 | }
32 |
33 | @EventHandler
34 | public void onPlayerQuit(PlayerQuitEvent event) {
35 | AssembleBoardDestroyEvent destroyEvent = new AssembleBoardDestroyEvent(event.getPlayer());
36 |
37 | Bukkit.getPluginManager().callEvent(destroyEvent);
38 | if (destroyEvent.isCancelled()) {
39 | return;
40 | }
41 |
42 | getAssemble().getBoards().remove(event.getPlayer().getUniqueId());
43 | event.getPlayer().setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/scoreboard/AssembleStyle.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.scoreboard;
2 |
3 | import lombok.Getter;
4 |
5 | @Getter
6 | public enum AssembleStyle {
7 |
8 | KOHI(true, 15);
9 |
10 | private boolean descending;
11 | private int startNumber;
12 |
13 | AssembleStyle(boolean descending, int startNumber) {
14 | this.descending = descending;
15 | this.startNumber = startNumber;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/scoreboard/events/AssembleBoardCreateEvent.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.scoreboard.events;
2 |
3 | import lombok.Getter;
4 | import org.bukkit.entity.Player;
5 | import org.bukkit.event.Cancellable;
6 | import org.bukkit.event.Event;
7 | import org.bukkit.event.HandlerList;
8 |
9 | @Getter
10 | public class AssembleBoardCreateEvent extends Event implements Cancellable {
11 |
12 | @Getter public static HandlerList handlerList = new HandlerList();
13 |
14 | private Player player;
15 | private boolean cancelled = false;
16 |
17 | public AssembleBoardCreateEvent(Player player) {
18 | this.player = player;
19 | }
20 |
21 | @Override
22 | public void setCancelled(boolean b) {
23 | this.cancelled = b;
24 | }
25 |
26 | @Override
27 | public HandlerList getHandlers() {
28 | return handlerList;
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/scoreboard/events/AssembleBoardCreatedEvent.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.scoreboard.events;
2 |
3 | import dev.panda.combofly.utilities.scoreboard.AssembleBoard;
4 | import lombok.Getter;
5 | import lombok.Setter;
6 | import org.bukkit.event.Event;
7 | import org.bukkit.event.HandlerList;
8 |
9 | @Getter @Setter
10 | public class AssembleBoardCreatedEvent extends Event {
11 |
12 | @Getter public static HandlerList handlerList = new HandlerList();
13 |
14 | private boolean cancelled = false;
15 | private final AssembleBoard board;
16 |
17 | public AssembleBoardCreatedEvent(AssembleBoard board) {
18 | this.board = board;
19 | }
20 |
21 | @Override
22 | public HandlerList getHandlers() {
23 | return handlerList;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/scoreboard/events/AssembleBoardDestroyEvent.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.scoreboard.events;
2 |
3 | import lombok.Getter;
4 | import org.bukkit.entity.Player;
5 | import org.bukkit.event.Cancellable;
6 | import org.bukkit.event.Event;
7 | import org.bukkit.event.HandlerList;
8 |
9 | @Getter
10 | public class AssembleBoardDestroyEvent extends Event implements Cancellable {
11 |
12 | @Getter public static HandlerList handlerList = new HandlerList();
13 |
14 | private Player player;
15 | private boolean cancelled = false;
16 |
17 | public AssembleBoardDestroyEvent(Player player) {
18 | this.player = player;
19 | }
20 |
21 | @Override
22 | public void setCancelled(boolean b) {
23 | this.cancelled = b;
24 | }
25 |
26 | @Override
27 | public HandlerList getHandlers() {
28 | return handlerList;
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/dev/panda/combofly/utilities/scoreboard/listener/AssembleListener.java:
--------------------------------------------------------------------------------
1 | package dev.panda.combofly.utilities.scoreboard.listener;
2 |
3 | import dev.panda.combofly.utilities.scoreboard.Assemble;
4 | import dev.panda.combofly.utilities.scoreboard.AssembleBoard;
5 | import dev.panda.combofly.utilities.scoreboard.events.AssembleBoardCreateEvent;
6 | import dev.panda.combofly.utilities.scoreboard.events.AssembleBoardDestroyEvent;
7 | import org.bukkit.Bukkit;
8 | import org.bukkit.event.Event;
9 | import org.bukkit.event.EventHandler;
10 | import org.bukkit.event.Listener;
11 | import org.bukkit.event.player.PlayerJoinEvent;
12 | import org.bukkit.event.player.PlayerQuitEvent;
13 |
14 | public class AssembleListener implements Listener {
15 |
16 | private final Assemble assemble;
17 |
18 | public AssembleListener(final Assemble assemble) {
19 | this.assemble = assemble;
20 | }
21 |
22 | @EventHandler
23 | public void onPlayerJoin(final PlayerJoinEvent event) {
24 | final AssembleBoardCreateEvent createEvent = new AssembleBoardCreateEvent(event.getPlayer());
25 | Bukkit.getPluginManager().callEvent(createEvent);
26 |
27 | if (createEvent.isCancelled()) {
28 | return;
29 | }
30 |
31 | this.getAssemble().getBoards().put(event.getPlayer().getUniqueId(),
32 | new AssembleBoard(event.getPlayer(), this.getAssemble()));
33 | }
34 |
35 | @EventHandler
36 | public void onPlayerQuit(final PlayerQuitEvent event) {
37 | final AssembleBoardDestroyEvent destroyEvent = new AssembleBoardDestroyEvent(event.getPlayer());
38 | Bukkit.getPluginManager().callEvent(destroyEvent);
39 |
40 | if (destroyEvent.isCancelled()) {
41 | return;
42 | }
43 |
44 | this.getAssemble().getBoards().remove(event.getPlayer().getUniqueId());
45 | event.getPlayer().setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
46 | }
47 |
48 | public Assemble getAssemble() {
49 | return this.assemble;
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/main/resources/claims.yml:
--------------------------------------------------------------------------------
1 | CLAIMS: {}
--------------------------------------------------------------------------------
/src/main/resources/config.yml:
--------------------------------------------------------------------------------
1 | # Type of Balance
2 | # [NORMAL, VAULT]
3 | BALANCE-TYPE: NORMAL
4 |
5 | #TICKS PER HIT
6 | HIT-TICKS:
7 | ENABLE: true
8 | TICKS: 1
9 |
10 | #KB STANDAR X = 0.18 | Y = 0.16 | Z = 0.18 | MAXHEIGHT = 1.5
11 | KNOCKBACK:
12 | ENABLE: true
13 | X: 0.18
14 | Y: 0.16
15 | Z: 0.18
16 | ENABLE-MAXHEIGHT: true
17 | MAXHEIGHT: 1.5
18 |
19 | DISCORD: "discord.pandacommunity.org"
20 | STORE: "store.pandacommunity.us"
21 | TEAMSPEAK: "ts.pandacommunity.us"
22 | TWITTER: "twitter.com/PandaPlugins"
23 | WEBSITE: "www.pandacommunity.org"
24 |
25 | STAFF:
26 | ENABLE: true
27 | STAFFMODE-JOIN: true
28 | JOIN-MESSAGE:
29 | ENABLE: true
30 | MESSAGE: "&7(&bStaff&7) &b{staff} &fjoin the server."
31 | QUIT-MESSAGE:
32 | ENABLE: true
33 | MESSAGE: "&7(&bStaff&7) &b{staff} &fleft the server."
34 |
35 | WELCOME-MESSAGE:
36 | STATUS: true
37 | MESSAGE:
38 | - "&fWelcome &4{player} &fto &cComboFly &7[&c#{playercount}&7]"
39 |
40 | JOIN-MESSAGE:
41 | STATUS: true
42 | MESSAGE:
43 | - "&7&m----------------------------------------------"
44 | - "&fWelcome &c&l{player} &fto &4&lPanda Community"
45 | - ""
46 | - "&c» &fDiscord: &c{discord}"
47 | - "&c» &7Store: &c{store}"
48 | - "&c» &7Teamspeak: &c{teamspeak}"
49 | - "&c» &7Twitter: &c{twitter}"
50 | - "&c» &7Website: &c{website}"
51 | - "&7&m----------------------------------------------"
52 |
53 | ONLINE-DONATORS-ANNOUNCE:
54 | NO-PLAYERS: true
55 | TOGGLE: true
56 | MESSAGE:
57 | - "&7&m---------------------------------------------"
58 | - "&cOnline Donators &7» &c{donators}"
59 | - ""
60 | - "&7You can buy rank at &c{store}"
61 | - "&7&m---------------------------------------------"
62 | MESSAGE-NO-DONATORS: "&fNo online donators."
63 |
64 | NO-PERMISSION:
65 | CONSOLE: "&cNo Console."
66 | PLAYER: "&cNo permission."
67 |
68 | PLAYER-NOTFOUND:
69 | MESSAGE: "&cPlayer '&f{argument}&c' not found."
70 |
71 | DEFAULT-MONEY: 250
72 |
73 | KOTH-REWARDS:
74 | - "say Winner {winner}"
75 |
76 | KILL-MONEY:
77 | ENABLE: true
78 | MONEY: 100
79 | KILL-MESSAGE: "&fYou earned &a${money} &ffor killing &c{target}&f."
80 |
81 | KIT-DEFAULT: ""
82 |
83 | KILL-REWARD:
84 | ENABLE: true
85 | REWARD:
86 | - "crate givekey {player} Kill 1"
87 |
88 | DEFAULT-KIT-ON-JOIN: true
89 |
90 | KILLSTREAK:
91 | COMMAND:
92 | - "&7&m---------------------------------------"
93 | - "&c&lKillStreak Info"
94 | - ""
95 | - "&c» &f3 Kills: &cRepair All."
96 | - "&c» &f5 Kills: &cInvisibility Effect (3 min)."
97 | - "&c» &f10 Kills: &cStrength II Effect (30 sec)."
98 | - "&c» &f12 Kills: &cSpeed IV Effect (1 min)."
99 | - "&c» &f15 Kills: &cRepair All."
100 | - "&c» &f20 Kills: &cStrength II (3 min) & Speed IV (3 min)."
101 | - "&7&m---------------------------------------"
102 | MESSAGE: "&4[KillStreak] &7{player} &creached a &7{streak} &ckillstreak!."
103 | #You can put any amount of killstreak, just copy and paste as you like.
104 | REWARDS:
105 | STREAK:
106 | "3":
107 | REPAIRALL: true
108 | MESSAGE: "&aYour entire inventory has been repaired."
109 | "5":
110 | REPAIRALL: false
111 | COMMANDS:
112 | - effect {player} INVISIBILITY 180
113 | MESSAGE: "&aYou have received invisibility for 3 minutes."
114 | "10":
115 | REPAIRALL: false
116 | COMMANDS:
117 | - effect {player} INCREASE_DAMAGE 30 1
118 | MESSAGE: "&aYou have received strength II for 30 seconds."
119 | "12":
120 | REPAIRALL: false
121 | COMMANDS:
122 | - effect {player} SPEED 60 3
123 | MESSAGE: "&aYou have received speed IV for 1 minute."
124 | "15":
125 | REPAIRALL: true
126 | MESSAGE: "&aYour entire inventory has been repaired."
127 | "20":
128 | REPAIRALL: false
129 | COMMANDS:
130 | - effect {player} INCREASE_DAMAGE 180 1
131 | - effect {player} SPEED 180 3
132 | MESSAGE: "&aYou have received strength II & speed IV for 3 minutes."
--------------------------------------------------------------------------------
/src/main/resources/kit.yml:
--------------------------------------------------------------------------------
1 | KITS: {}
--------------------------------------------------------------------------------
/src/main/resources/koths.yml:
--------------------------------------------------------------------------------
1 | KOTHS: {}
--------------------------------------------------------------------------------
/src/main/resources/plugin.yml:
--------------------------------------------------------------------------------
1 | main: dev.panda.combofly.ComboFly
2 | name: PandaFly
3 | version: ${project.version}
4 | authors: ["KenAlesk", "TulioTriste", "Risas"]
5 | load: POSTWORLD
--------------------------------------------------------------------------------
/src/main/resources/profile.yml:
--------------------------------------------------------------------------------
1 | PROFILES: {}
--------------------------------------------------------------------------------
/src/main/resources/scoreboard.yml:
--------------------------------------------------------------------------------
1 | TITLE-ANIMATION-ENABLE: true
2 | TITLE-TASK: 0.3
3 | TITLE:
4 | - "&c&lCombo &7| &fSeason #2"
5 | - "&f&lC&c&lombo &7| &fSeason #2"
6 | - "&f&lCo&c&lmbo &7| &fSeason #2"
7 | - "&f&lCom&c&lbo &7| &fSeason #2"
8 | - "&f&lComb&c&lo &7| &fSeason #2"
9 | - "&f&lCombo &7| &fSeason #2"
10 | LINES:
11 | - "&7&m---------------------"
12 | - "{staffmode}"
13 | - "&fKills&7: &c{kills}"
14 | - "&fDeaths&7: &c{deaths}"
15 | - "&fMoney&7: &c{balance}"
16 | - "&4Combat&7: &c{combat}s"
17 | - "&3Enderpearl&7: &c{enderpearl}s"
18 | - "&aSpawn&7: &c{spawn}s"
19 | - "{pandaAbility}"
20 | - "{koth}"
21 | - "&7&m---------------------"
22 |
23 | KOTH:
24 | - "&7&m---------------------"
25 | - "&9&l{koth}&7: &r{time}"
26 | - "&b{capper}"
27 |
28 | FOOTER-ENABLE: true
29 | FOOTER-ANIMATION-ENABLE: true
30 | FOOTER-TASK: 2.0
31 | FOOTER:
32 | - "&o&7pandacommunity.org"
33 | - "&o&9discord.pandacommunity.org"
34 | - "&o&b@PandaPlugins"
35 |
36 | VARIABLES:
37 | STAFFMODE:
38 | - "&4&lStaffMode"
39 | - "&fVanish&7: &c{vanish}"
40 | - "&fOnline&7: &c{online}"
41 | - "&7&m---------------------"
42 |
43 | PANDAABILITY:
44 | GLOBAL-COOLDOWN: "%name%&f: %cooldown%"
45 | COOLDOWNS: "%name%&f: &c%cooldown%"
--------------------------------------------------------------------------------
/src/main/resources/spawn.yml:
--------------------------------------------------------------------------------
1 | SPAWN: {}
--------------------------------------------------------------------------------
/src/main/resources/staff-items.yml:
--------------------------------------------------------------------------------
1 | PHASE:
2 | ENABLE: true
3 | ITEM: "COMPASS"
4 | DATA: 0
5 | NAME: "&6Phase &7(Left/Right Click)"
6 | SLOT: 0
7 |
8 | INSPECTOR:
9 | ENABLE: true
10 | ITEM: "BOOK"
11 | DATA: 0
12 | NAME: "&6Inspector &7(Right Click)"
13 | SLOT: 1
14 |
15 | WORLD-EDIT:
16 | ENABLE: true
17 | ITEM: "WOOD_AXE"
18 | DATA: 0
19 | NAME: "&6WorldEdit &7(Left/Right Click)"
20 | SLOT: 2
21 |
22 | FREEZE:
23 | ENABLE: true
24 | ITEM: "PACKED_ICE"
25 | DATA: 0
26 | NAME: "&6Freeze &7(Right Click)"
27 | SLOT: 4
28 |
29 | MINER:
30 | ENABLE: true
31 | ITEM: "DIAMOND_PICKAXE"
32 | DATA: 0
33 | NAME: "&6Miners &7(Right Click)"
34 | SLOT: 5
35 |
36 | STAFF-ONLINE:
37 | ENABLE: true
38 | ITEM: "FEATHER"
39 | DATA: 0
40 | NAME: "&6Staff Online &7(Right Click)"
41 | SLOT: 6
42 |
43 | VANISH-ON:
44 | ENABLE: true
45 | ITEM: "INK_SACK"
46 | DATA: 10
47 | NAME: "&6Vanish&7: &aON &7(Right Click)"
48 | SLOT: 7
49 |
50 | VANISH-OFF:
51 | ENABLE: true
52 | ITEM: "INK_SACK"
53 | DATA: 8
54 | NAME: "&6Vanish&7: &cOFF &7(Right Click)"
55 | SLOT: 7
56 |
57 | RANDOM-TELEPORT:
58 | ENABLE: true
59 | ITEM: "BEACON"
60 | DATA: 0
61 | NAME: "&6Random Teleport &7(Right Click)"
62 | SLOT: 8
--------------------------------------------------------------------------------
/src/main/resources/tablist.yml:
--------------------------------------------------------------------------------
1 | # Information Variables: {name}, {rank}, {rank-prefix}, {rank-suffix}, {ping}
2 | # Network Variables: {online}, {slots}
3 | # Social Variables: {discord}, {store}, {teamspeak}, {twitter}, {website}
4 | # WARNING: All Tablist sections must contain 20 lines!
5 | ENABLE: true #Restart the server when you change this option
6 | TABLIST-HEADER: "&c&lPanda Community"
7 | TABLIST-FOOTER: "&7&opandamc.us"
8 | TABLIST:
9 | LEFT:
10 | - ""
11 | - "&7&m--------------------"
12 | - ""
13 | - ""
14 | - ""
15 | - ""
16 | - ""
17 | - "&c&lStatistics"
18 | - " &7\u27A5 &fKills: &f{kills}"
19 | - " &7\u27A5 &fDeaths&7: &f{deaths}"
20 | - " &7\u27A5 &fBalance&7: &f{balance}"
21 | - ""
22 | - ""
23 | - ""
24 | - ""
25 | - ""
26 | - ""
27 | - "&7&m--------------------"
28 | - "&cTwitter"
29 | - "&f{twitter}"
30 | CENTER:
31 | - "&c&lPanda Community"
32 | - "&7&m-------------------"
33 | - ""
34 | - ""
35 | - ""
36 | - ""
37 | - "&c&lServer"
38 | - " &7\u27A5 &fCombo"
39 | - ""
40 | - ""
41 | - ""
42 | - "&c&lPlayers"
43 | - " &7\u27A5 &f{online}/{slots}"
44 | - ""
45 | - ""
46 | - ""
47 | - ""
48 | - "&7&m--------------------"
49 | - "&cStore"
50 | - "&f{store}"
51 | RIGHT:
52 | - ""
53 | - "&7&m--------------------"
54 | - ""
55 | - ""
56 | - ""
57 | - ""
58 | - ""
59 | - "&c&lYour Information"
60 | - " &7\u27A5 &fName&7: &f{name}"
61 | - " &7\u27A5 &fRank&7: &f{rank-suffix}"
62 | - " &7\u27A5 &fPing&7: &f{ping}"
63 | - ""
64 | - ""
65 | - ""
66 | - ""
67 | - ""
68 | - ""
69 | - "&7&m--------------------"
70 | - "&cTeamspeak"
71 | - "&f{teamspeak}"
72 | EXTERNAL-RIGHT: #ONLY WORK IN 1.8
73 | - ""
74 | - "&7&m--------------------"
75 | - ""
76 | - ""
77 | - ""
78 | - ""
79 | - ""
80 | - ""
81 | - "&fIf you need help,"
82 | - "&fyou can use the"
83 | - "&c/help &fcommand."
84 | - ""
85 | - ""
86 | - ""
87 | - ""
88 | - ""
89 | - ""
90 | - "&7&m--------------------"
91 | - "&cWebsite"
92 | - "&f{website}"
--------------------------------------------------------------------------------
/src/main/resources/warp.yml:
--------------------------------------------------------------------------------
1 | WARPS: {}
--------------------------------------------------------------------------------