diff --git a/api/src/main/java/de/erethon/dungeonsxl/api/DungeonsAPI.java b/api/src/main/java/de/erethon/dungeonsxl/api/DungeonsAPI.java new file mode 100644 index 00000000..a7696f17 --- /dev/null +++ b/api/src/main/java/de/erethon/dungeonsxl/api/DungeonsAPI.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2012-2020 Frank Baumann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.erethon.dungeonsxl.api; + +import de.erethon.commons.misc.Registry; +import de.erethon.dungeonsxl.api.dungeon.Dungeon; +import de.erethon.dungeonsxl.api.player.PlayerClass; +import de.erethon.dungeonsxl.api.player.PlayerGroup; +import de.erethon.dungeonsxl.api.sign.DungeonSignType; +import java.io.File; +import java.util.Collection; +import org.bukkit.entity.Player; + +/** + * @author Daniel Saukel + */ +public interface DungeonsAPI { + + static final File PLUGIN_ROOT = new File("plugins/DungeonsXL"); + static final File BACKUPS = new File(PLUGIN_ROOT, "backups"); + static final File LANGUAGES = new File(PLUGIN_ROOT, "languages"); + static final File MAPS = new File(PLUGIN_ROOT, "maps"); + static final File PLAYERS = new File(PLUGIN_ROOT, "players"); + static final File SCRIPTS = new File(PLUGIN_ROOT, "scripts"); + static final File ANNOUNCERS = new File(SCRIPTS, "announcers"); + static final File CLASSES = new File(SCRIPTS, "classes"); + static final File DUNGEONS = new File(SCRIPTS, "dungeons"); + static final File SIGNS = new File(SCRIPTS, "signs"); + + /** + * Returns a {@link Registry} of the loaded classes. + * + * @return a {@link Registry} of the loaded classes + */ + Registry getClassRegistry(); + + /* Object initialization */ + /** + * Creates a new group. + * + * @param leader the leader + * @return a new group + */ + PlayerGroup createGroup(Player leader); + + /** + * Creates a new group. + * + * @param leader the leader + * @param color the color that represents the group and sets the name + * @return a new group or null if values are invalid + */ + PlayerGroup createGroup(Player leader, PlayerGroup.Color color); + + /** + * Creates a new group. + * + * @param leader the leader + * @param name the group's name - must be unique + * @return a new group or null if values are invalid + */ + PlayerGroup createGroup(Player leader, String name); + + /** + * Creates a new group. + * + * @param leader the leader + * @param dungeon the dungeon to play + * @return a new group or null if values are invalid + */ + PlayerGroup createGroup(Player leader, Dungeon dungeon); + + /** + * Creates a new group. + * + * @param leader the leader + * @param members the group members with or without the leader + * @param name the name of the group + * @param dungeon the dungeon to play + * @return a new group or null if values are invalid + */ + PlayerGroup createGroup(Player leader, Collection members, String name, Dungeon dungeon); + +} diff --git a/api/src/main/java/de/erethon/dungeonsxl/api/player/EditPlayer.java b/api/src/main/java/de/erethon/dungeonsxl/api/player/EditPlayer.java new file mode 100644 index 00000000..1b2a57ee --- /dev/null +++ b/api/src/main/java/de/erethon/dungeonsxl/api/player/EditPlayer.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2012-2020 Frank Baumann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.erethon.dungeonsxl.api.player; + +import de.erethon.dungeonsxl.api.world.EditWorld; + +/** + * Represents a player in an edit instance. + *

+ * All players in an edit world have one wrapper object that is an instance of EditPlayer. + * + * @author Daniel Saukel + */ +public interface EditPlayer extends InstancePlayer { + + /** + * Returns the {@link de.erethon.dungeonsxl.api.world.EditWorld} the player is editing. + * + * @return the {@link de.erethon.dungeonsxl.api.world.EditWorld} the player is editing + */ + EditWorld getEditWorld(); + + /** + * Returns the lines of a sign the player has copied with a stick tool in an array with the length of four. + * + * @return the lines of a sign the player has copied with a stick tool in an array with the length of four + */ + String[] getCopiedLines(); + + /** + * Sets the memorized sign lines. + * + * @param copiedLines the lines + */ + void setCopiedLines(String[] copiedLines); + + /** + * Makes the player leave the edit world without saving the progress. + */ + void escape(); + +} diff --git a/api/src/main/java/de/erethon/dungeonsxl/api/player/GamePlayer.java b/api/src/main/java/de/erethon/dungeonsxl/api/player/GamePlayer.java new file mode 100644 index 00000000..2ff84a93 --- /dev/null +++ b/api/src/main/java/de/erethon/dungeonsxl/api/player/GamePlayer.java @@ -0,0 +1,210 @@ +/* + * Copyright (C) 2012-2020 Frank Baumann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.erethon.dungeonsxl.api.player; + +import org.bukkit.Location; + +/** + * Represents a player in a game dungeon instance. + *

+ * All players in a game world have one wrapper object that is an instance of GamePlayer. + * + * @author Daniel Saukel + */ +public interface GamePlayer extends InstancePlayer { + + /** + * Returns if the player is ready to start the game. + *

+ * This is usually achieved by triggering a ready sign. + * + * @return if the player is ready to start the game + */ + boolean isReady(); + + /** + * Returns if the player finished the game. + *

+ * This is usually achieved by triggering an end sign. + *

+ * It is used for both the end of a whole dungeon and the end of a floor. + * + * @return if the player finished the game + */ + boolean isFinished(); + + /** + * Sets if the player finished their game. + * + * @param finished if the player finished the game + */ + void setFinished(boolean finished); + + /** + * Returns the player's class or null if they have none. + * + * @return the player's class + */ + PlayerClass getPlayerClass(); + + /** + * Sets and applies the given class. + * + * @param playerClass the class + */ + void setPlayerClass(PlayerClass playerClass); + + /** + * Returns the location of the last checkpoint the player reached. + * + * @return the location of the last checkpoint the player reached + */ + Location getLastCheckpoint(); + + /** + * Sets the location of the last checkpoint the player reached. + *

+ * This is where the player respawns if they die and have -1 or >0 {@link #getLives() lives} left. + * + * @param checkpoint the checkpoint location + */ + void setLastCheckpoint(Location checkpoint); + + /** + * Returns the saved time millis from when the player went offline. + * + * @return the saved time millis from when the player went offline + */ + long getOfflineTimeMillis(); + + /** + * Sets the saved time millis from when the player went offline. + * + * @param time the time millis + */ + void setOfflineTimeMillis(long time); + + /** + * Returns the original amount of lives the player had in the current game or -1 if lives aren't used. + * + * @return the original amount of lives the player had in the current game or -1 if lives aren't used + */ + int getInitialLives(); + + /** + * Sets the original amount of lives the player had in the current game; -1 means lives aren't used. + * + * @param lives the amount of lives + */ + void setInitialLives(int lives); + + /** + * Returns the lives the player has left or -1 if per player lives aren't used. + * + * @return the lives the player has left or -1 if per player lives aren't used + */ + int getLives(); + + /** + * Sets the lives the player has left. + *

+ * This is not to be used if the dungeon uses group lives. + * + * @param lives the lives + */ + void setLives(int lives); + + /** + * Returns if the player is stealing another group's flag. + * + * @return if the player is stealing another group's flag + */ + boolean isStealingFlag(); + + /** + * Returns the group whose flag the player robbed; null if the player isn't stealing any. + * + * @return the group whose flag the player robbed; null if the player isn't stealing any + */ + PlayerGroup getRobbedGroup(); + + /** + * Sets the player to be stealing the team flag of the given group. + * + * @param group the group + */ + void setRobbedGroup(PlayerGroup group); + + /* Actions */ + /** + * Scores a point. + */ + void captureFlag(); + + /** + * Makes the player leave his group and dungeon. + *

+ * This sends default messages to the player. + */ + @Override + default void leave() { + leave(true); + } + + /** + * Makes the player leave his group and dungeon. + * + * @param sendMessages if default messages shall be sent to the player + */ + void leave(boolean sendMessages); + + /** + * Treats the player as if they lost their last life and kicks them from the dungeon. + */ + void kill(); + + /** + * Sets the player to be ready to start the dungeon game, like when a ready sign is triggered. + *

+ * If all other players in the group are already {@link #isReady() ready}, the game is started. + * + * @return if the game has been started. + */ + boolean ready(); + + /** + * Respawns the player. Also teleports DXL pets if there are any. + */ + void respawn(); + + /** + * The player finishs the current game. + *

+ * This sends default messages to the player. + */ + default void finish() { + finish(true); + } + + /** + * The player finishs the current game. + * + * @param sendMessages if default messages shall be sent to the player + */ + void finish(boolean sendMessages); + +} diff --git a/api/src/main/java/de/erethon/dungeonsxl/api/player/GlobalPlayer.java b/api/src/main/java/de/erethon/dungeonsxl/api/player/GlobalPlayer.java new file mode 100644 index 00000000..b5782975 --- /dev/null +++ b/api/src/main/java/de/erethon/dungeonsxl/api/player/GlobalPlayer.java @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2012-2020 Frank Baumann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.erethon.dungeonsxl.api.player; + +import de.erethon.commons.chat.MessageUtil; +import de.erethon.commons.player.PlayerWrapper; +import java.util.List; +import org.bukkit.Location; +import org.bukkit.inventory.ItemStack; + +/** + * Represents a player anywhere on the server. + *

+ * All players on the server, including the ones in dungeons, have one wrapper object that is an instance of GlobalPlayer. + * + * @author Daniel Saukel + */ +public interface GlobalPlayer extends PlayerWrapper { + + /** + * Returns the player's group. + * + * @return the player's group. + */ + PlayerGroup getGroup(); + + /** + * Returns if the player uses the built-in group chat. + * + * @return if the player uses the built-in group chat + */ + boolean isInGroupChat(); + + /** + * Sets if the player uses the built-in group chat. + * + * @param groupChat if the player shall use the built-in group chat + */ + void setInGroupChat(boolean groupChat); + + /** + * Returns if the player may read messages from the built-in group chat. + * + * @return if the player may read messages from the built-in group chat + */ + boolean isInChatSpyMode(); + + /** + * Sets if the player may read messages from the built-in group chat. + * + * @param chatSpyMode if the player may read messages from the built-in group chat + */ + void setInChatSpyMode(boolean chatSpyMode); + + /** + * Checks if the player has the given permission. + * + * @param permission the permission + * @return if the player has the given permission + */ + default boolean hasPermission(String permission) { + return getPlayer().hasPermission(permission); + } + + /** + * Returns the reward items a player collected in a dungeon game. + * + * @return the reward items a player collected in a dungeon game + */ + public List getRewardItems(); + + /** + * Returns if the player has any reward items left. + * + * @return if the player has any reward items left + */ + public boolean hasRewardItemsLeft(); + + /** + * Returns if the player is currently breaking a global protection (=using /dxl break). + * + * @return if the player is currently breaking a global protection (=using /dxl break) + */ + boolean isInBreakMode(); + + /** + * Sets the player into or out of break mode; see {@link #isInBreakMode()}. + * + * @param breakMode if the player may break global protections + */ + void setInBreakMode(boolean breakMode); + + /** + * Sends a message to the player. + * + * @param message the message to send + */ + default void sendMessage(String message) { + MessageUtil.sendMessage(getPlayer(), message); + } + + /** + * Respawns the player at his old position before he was in a dungeon. + * + * @param keepInventory if the saved status shall be reset + */ + void reset(boolean keepInventory); + + /** + * Respawns the player at his old position before he was in a dungeon. + * + * @param tpLoc the location where the player shall respawn + * @param keepInventory if the saved status shall be reset + */ + void reset(Location tpLoc, boolean keepInventory); + +} diff --git a/api/src/main/java/de/erethon/dungeonsxl/api/player/InstancePlayer.java b/api/src/main/java/de/erethon/dungeonsxl/api/player/InstancePlayer.java new file mode 100644 index 00000000..1ba47148 --- /dev/null +++ b/api/src/main/java/de/erethon/dungeonsxl/api/player/InstancePlayer.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2012-2020 Frank Baumann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.erethon.dungeonsxl.api.player; + +import org.bukkit.World; + +/** + * Represents a player in an instance. + *

+ * All players in a world instantiated by DungeonsXL, have one wrapper object that is an instance of InstancePlayer. + * + * @author Daniel Saukel + */ +public interface InstancePlayer extends GlobalPlayer { + + /** + * The world of the instance, where the player is supposed to be. + * + * @return the world of the instance + */ + World getWorld(); + + /** + * Makes the player leave his group and dungeon. + */ + void leave(); + +} diff --git a/api/src/main/java/de/erethon/dungeonsxl/api/player/PlayerClass.java b/api/src/main/java/de/erethon/dungeonsxl/api/player/PlayerClass.java new file mode 100644 index 00000000..b0aba711 --- /dev/null +++ b/api/src/main/java/de/erethon/dungeonsxl/api/player/PlayerClass.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2012-2020 Frank Baumann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.erethon.dungeonsxl.api.player; + +import de.erethon.caliburn.CaliburnAPI; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.inventory.ItemStack; + +/** + * Represents a class and a class script. + * + * @author Frank Baumann, Daniel Saukel + */ +public class PlayerClass { + + private String name; + + private List items = new ArrayList<>(); + private boolean dog; + + /** + * Creates a PlayerClass from a class YAML file. The name is taken from the file name. + * + * @param caliburn the CaliburnAPI instance + * @param file the class config file + */ + public PlayerClass(CaliburnAPI caliburn, File file) { + this(caliburn, file.getName().substring(0, file.getName().length() - 4), YamlConfiguration.loadConfiguration(file)); + } + + /** + * Creates a PlayerClass from the given class config. + * + * @param caliburn the CaliburnAPI instance + * @param name the class name + * @param config the config + */ + public PlayerClass(CaliburnAPI caliburn, String name, FileConfiguration config) { + this.name = name; + + if (config.contains("items")) { + items = caliburn.deserializeStackList(config, "items"); + } + + if (config.contains("dog")) { + dog = config.getBoolean("dog"); + } + } + + public PlayerClass(String name, List items, boolean dog) { + this.items = items; + this.name = name; + this.dog = dog; + } + + /** + * Returns the name of the class. + * + * @return the name of the class + */ + public String getName() { + return name; + } + + /** + * Returns the list of the items this class gives to a player. + * + * @return the list of the the items this class gives to a player + */ + public List getItems() { + return items; + } + + /** + * Adds the given item to this class. + * + * @param itemStack the ItemStack to add + */ + public void addItem(ItemStack itemStack) { + items.add(itemStack); + } + + /** + * Removes the given item from this class. + * + * @param itemStack the ItemStack to remove + */ + public void removeItem(ItemStack itemStack) { + items.remove(itemStack); + } + + /** + * Returns if the class gives the player a dog. + * + * @return if the class has a dog + * @deprecated More dynamic pet features might make this obsolete in the future. + */ + @Deprecated + public boolean hasDog() { + return dog; + } + + /** + * Sets if the class gives the player a dog. + * + * @param dog if the class shall give the player a dog + * @deprecated More dynamic pet features might make this obsolete in the future. + */ + @Deprecated + public void setDog(boolean dog) { + this.dog = dog; + } + +} diff --git a/api/src/main/java/de/erethon/dungeonsxl/api/player/PlayerGroup.java b/api/src/main/java/de/erethon/dungeonsxl/api/player/PlayerGroup.java new file mode 100644 index 00000000..cf1c4f4a --- /dev/null +++ b/api/src/main/java/de/erethon/dungeonsxl/api/player/PlayerGroup.java @@ -0,0 +1,327 @@ +/* + * Copyright (C) 2012-2020 Frank Baumann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.erethon.dungeonsxl.api.player; + +import de.erethon.caliburn.item.ExItem; +import de.erethon.caliburn.item.VanillaItem; +import de.erethon.commons.compatibility.Version; +import de.erethon.commons.player.PlayerCollection; +import de.erethon.dungeonsxl.api.dungeon.Dungeon; +import de.erethon.dungeonsxl.api.world.GameWorld; +import org.bukkit.ChatColor; +import org.bukkit.DyeColor; +import org.bukkit.entity.Player; + +/** + * Represents a group of players provided by DungeonsXL. + * + * @author Daniel Saukel + */ +public interface PlayerGroup { + + /** + * Links different color types together. + */ + public enum Color { + + BLACK(ChatColor.BLACK, DyeColor.BLACK, VanillaItem.BLACK_WOOL), + DARK_GRAY(ChatColor.DARK_GRAY, DyeColor.GRAY, VanillaItem.GRAY_WOOL), + LIGHT_GRAY(ChatColor.GRAY, DyeColor.valueOf(Version.isAtLeast(Version.MC1_13) ? "LIGHT_GRAY" : "SILVER"), VanillaItem.LIGHT_GRAY_WOOL), + WHITE(ChatColor.WHITE, DyeColor.WHITE, VanillaItem.WHITE_WOOL), + DARK_GREEN(ChatColor.DARK_GREEN, DyeColor.GREEN, VanillaItem.GREEN_WOOL), + LIGHT_GREEN(ChatColor.GREEN, DyeColor.LIME, VanillaItem.LIME_WOOL), + CYAN(ChatColor.DARK_AQUA, DyeColor.CYAN, VanillaItem.CYAN_WOOL), + DARK_BLUE(ChatColor.DARK_BLUE, DyeColor.BLUE, VanillaItem.BLUE_WOOL), + LIGHT_BLUE(ChatColor.AQUA, DyeColor.LIGHT_BLUE, VanillaItem.LIGHT_BLUE_WOOL), + PURPLE(ChatColor.DARK_PURPLE, DyeColor.PURPLE, VanillaItem.PURPLE_WOOL), + MAGENTA(ChatColor.LIGHT_PURPLE, DyeColor.MAGENTA, VanillaItem.MAGENTA_WOOL), + DARK_RED(ChatColor.DARK_RED, DyeColor.BROWN, VanillaItem.BROWN_WOOL), + LIGHT_RED(ChatColor.RED, DyeColor.RED, VanillaItem.RED_WOOL), + ORANGE(ChatColor.GOLD, DyeColor.ORANGE, VanillaItem.ORANGE_WOOL), + YELLOW(ChatColor.YELLOW, DyeColor.YELLOW, VanillaItem.YELLOW_WOOL), + PINK(ChatColor.BLUE, DyeColor.PINK, VanillaItem.PINK_WOOL); + + private ChatColor chat; + private DyeColor dye; + private VanillaItem woolMaterial; + + Color(ChatColor chat, DyeColor dye, VanillaItem woolMaterial) { + this.chat = chat; + this.dye = dye; + this.woolMaterial = woolMaterial; + } + + /** + * Returns the ChatColor. + * + * @return the ChatColor + */ + public ChatColor getChatColor() { + return chat; + } + + /** + * Returns the DyeColor. + * + * @return the DyeColor + */ + public DyeColor getDyeColor() { + return dye; + } + + /** + * Returns the RGB value. + * + * @return the RGB value + */ + public int getRGBColor() { + return dye.getColor().asRGB(); + } + + /** + * Returns the wool material. + * + * @return the wool material + */ + public VanillaItem getWoolMaterial() { + return woolMaterial; + } + + /** + * Returns the GroupColor matching the ChatColor or null if none exists. + * + * @param color the ChatColor to check + * @return the GroupColor matching the ChatColor or null if none exists + */ + public static Color getByChatColor(ChatColor color) { + for (Color groupColor : values()) { + if (groupColor.chat == color) { + return groupColor; + } + } + return null; + } + + /** + * Returns the GroupColor matching the DyeColor or null if none exists. + * + * @param color the DyeColor to check + * @return the GroupColor matching the DyeColor or null if none exists. + */ + public static Color getByDyeColor(DyeColor color) { + for (Color groupColor : values()) { + if (groupColor.dye == color) { + return groupColor; + } + } + return null; + } + + /** + * Returns the GroupColor matching the wool material or null if none exists. + * + * @param wool the wool material to check + * @return the GroupColor matching the wool material or null if none exists + */ + public static Color getByWoolType(ExItem wool) { + for (Color groupColor : values()) { + if (groupColor.woolMaterial == wool) { + return groupColor; + } + } + return null; + } + + } + + /** + * Returns the ID. + * + * @return the ID + */ + int getId(); + + /** + * Returns the formatted name. + *

+ * This is the name used e.g. in messages. + * + * @return the formatted name + */ + String getName(); + + /** + * Returns the raw, unformatted name. + *

+ * This is the name used e.g. in command arguments. + * + * @return the raw, unformatted name + */ + String getRawName(); + + /** + * Sets the name. + * + * @param name the name + */ + void setName(String name); + + /** + * Sets the name to a default value taken from the color. + *

+ * In the default implementation, this is nameOfTheColor#{@link #getId()} + * + * @param color the color + */ + default void setName(Color color) { + setName(color.toString() + "#" + getId()); + } + + /** + * The player who has permission to manage the group. + * + * @return the player who has permission to manage the group + */ + Player getLeader(); + + /** + * Sets the leader to another group member. + * + * @param player the new leader + */ + void setLeader(Player player); + + /** + * Returns a PlayerCollection of the group members + * + * @return a PlayerCollection of the group members + */ + PlayerCollection getMembers(); + + /** + * Adds a player to the group. + *

+ * The default implemenation calls {@link #addPlayer(Player, boolean)} with messages set to true. + * + * @param player the player to add + */ + default void addPlayer(Player player) { + addPlayer(player, true); + } + + /** + * Adds a player to the group. + * + * @param player the player to add + * @param message if messages shall be sent + */ + void addPlayer(Player player, boolean message); + + /** + * Removes a player from the group. + *

+ * The default implemenation calls {@link #removePlayer(Player, boolean)} with messages set to true. + * + * @param player the player to add + */ + default void removePlayer(Player player) { + addPlayer(player, true); + } + + /** + * Removes a player from the group. + * + * @param player the player to add + * @param message if messages shall be sent + */ + void removePlayer(Player player, boolean message); + + /** + * Returns a PlayerCollection of the players who are invited to join the group but did not yet do so. + * + * @return a PlayerCollection of the players who are invited to join the group but did not yet do so + */ + PlayerCollection getInvitedPlayers(); + + /** + * Invites a player to join the group. + * + * @param player the player to invite + * @param message if messages shall be sent + */ + void addInvitedPlayer(Player player, boolean message); + + /** + * Removes an invitation priviously made for a player to join the group. + * + * @param player the player to uninvite + * @param message if messages shall be sent + */ + void removeInvitedPlayer(Player player, boolean message); + + /** + * Removes all invitations for players who are not online. + */ + void clearOfflineInvitedPlayers(); + + /** + * Returns the game world the group is in. + * + * @return the game world the group is in + */ + GameWorld getGameWorld(); + + /** + * Sets the game world the group is in. + * + * @param gameWorld the game world to set + */ + void setGameWorld(GameWorld gameWorld); + + /** + * Returns the dungeon the group is playing or has remembered to play next. + *

+ * The latter is for example used when a group is created by a group sign sothat a portal or the auto-join function knows where to send the group. + * + * @return the dungeon the group is playing or has remembered to play next + */ + Dungeon getDungeon(); + + /** + * Returns if the group is already playing its remembered {@link #getDungeon() dungeon}. + * + * @return if the group is already playing its remembered {@link #getDungeon() dungeon} + */ + boolean isPlaying(); + + /** + * Returns the amount of lives the group currently has left or -1 if group lives are not used. + * + * @return the amount of lives the group currently has left or -1 if group lives are not used + */ + int getLives(); + + /** + * Sets the amount of lives the group currently has left. + *

+ * The value must be >=0 or -1, which means unlimited lives. + * + * @param lives the amount of lives the group currently has left + */ + void setLives(int lives); + +} diff --git a/api/src/main/java/de/erethon/dungeonsxl/util/DColor.java b/api/src/main/java/de/erethon/dungeonsxl/util/DColor.java deleted file mode 100644 index a5a24826..00000000 --- a/api/src/main/java/de/erethon/dungeonsxl/util/DColor.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2012-2019 Frank Baumann - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package de.erethon.dungeonsxl.util; - -import de.erethon.caliburn.item.ExItem; -import de.erethon.caliburn.item.VanillaItem; -import de.erethon.commons.compatibility.Version; -import org.bukkit.ChatColor; -import org.bukkit.DyeColor; - -/** - * Links different color types together. - * - * @author Daniel Saukel - */ -public enum DColor { - - BLACK(ChatColor.BLACK, DyeColor.BLACK, VanillaItem.BLACK_WOOL), - DARK_GRAY(ChatColor.DARK_GRAY, DyeColor.GRAY, VanillaItem.GRAY_WOOL), - LIGHT_GRAY(ChatColor.GRAY, DyeColor.valueOf(Version.isAtLeast(Version.MC1_13) ? "LIGHT_GRAY" : "SILVER"), VanillaItem.LIGHT_GRAY_WOOL), - WHITE(ChatColor.WHITE, DyeColor.WHITE, VanillaItem.WHITE_WOOL), - DARK_GREEN(ChatColor.DARK_GREEN, DyeColor.GREEN, VanillaItem.GREEN_WOOL), - LIGHT_GREEN(ChatColor.GREEN, DyeColor.LIME, VanillaItem.LIME_WOOL), - CYAN(ChatColor.DARK_AQUA, DyeColor.CYAN, VanillaItem.CYAN_WOOL), - DARK_BLUE(ChatColor.DARK_BLUE, DyeColor.BLUE, VanillaItem.BLUE_WOOL), - LIGHT_BLUE(ChatColor.AQUA, DyeColor.LIGHT_BLUE, VanillaItem.LIGHT_BLUE_WOOL), - PURPLE(ChatColor.DARK_PURPLE, DyeColor.PURPLE, VanillaItem.PURPLE_WOOL), - MAGENTA(ChatColor.LIGHT_PURPLE, DyeColor.MAGENTA, VanillaItem.MAGENTA_WOOL), - DARK_RED(ChatColor.DARK_RED, DyeColor.BROWN, VanillaItem.BROWN_WOOL), - LIGHT_RED(ChatColor.RED, DyeColor.RED, VanillaItem.RED_WOOL), - ORANGE(ChatColor.GOLD, DyeColor.ORANGE, VanillaItem.ORANGE_WOOL), - YELLOW(ChatColor.YELLOW, DyeColor.YELLOW, VanillaItem.YELLOW_WOOL), - PINK(ChatColor.BLUE, DyeColor.PINK, VanillaItem.PINK_WOOL); - - private ChatColor chat; - private DyeColor dye; - private VanillaItem woolMaterial; - - DColor(ChatColor chat, DyeColor dye, VanillaItem woolMaterial) { - this.chat = chat; - this.dye = dye; - this.woolMaterial = woolMaterial; - } - - /** - * @return the ChatColor - */ - public ChatColor getChatColor() { - return chat; - } - - /** - * @return the DyeColor - */ - public DyeColor getDyeColor() { - return dye; - } - - /** - * @return the RGB value - */ - public int getRGBColor() { - return dye.getColor().asRGB(); - } - - /** - * @return the wool material - */ - public VanillaItem getWoolMaterial() { - return woolMaterial; - } - - /** - * @param color the ChatColor to check - * @return the matching DColor or null - */ - public static DColor getByChatColor(ChatColor color) { - for (DColor dColor : values()) { - if (dColor.chat == color) { - return dColor; - } - } - return null; - } - - /** - * @param color the DyeColor to check - * @return the matching DColor or null - */ - public static DColor getByDyeColor(DyeColor color) { - for (DColor dColor : values()) { - if (dColor.dye == color) { - return dColor; - } - } - return null; - } - - /** - * @param wool the wool item to check - * @return the matching DColor or null - */ - public static DColor getByWoolType(ExItem wool) { - for (DColor dColor : values()) { - if (dColor.woolMaterial == wool) { - return dColor; - } - } - return null; - } - -}