diff --git a/API/src/main/java/com/bgsoftware/superiorskyblock/api/wrappers/SuperiorPlayer.java b/API/src/main/java/com/bgsoftware/superiorskyblock/api/wrappers/SuperiorPlayer.java index 8c91d6b32..c868f5908 100644 --- a/API/src/main/java/com/bgsoftware/superiorskyblock/api/wrappers/SuperiorPlayer.java +++ b/API/src/main/java/com/bgsoftware/superiorskyblock/api/wrappers/SuperiorPlayer.java @@ -16,6 +16,7 @@ import org.bukkit.scheduler.BukkitTask; import javax.annotation.Nullable; +import java.util.List; import java.util.Locale; import java.util.UUID; import java.util.function.Consumer; @@ -268,6 +269,31 @@ public interface SuperiorPlayer extends IMissionsHolder, IPersistentDataHolder, */ boolean hasIsland(); + /** + * Add an invitation to an island for the player. + * Do not call use this method directly unless you know what you're doing. + * Instead, use {@link Island#inviteMember(SuperiorPlayer)} + * + * @param island The island that invited the player. + */ + void addInvite(Island island); + + /** + * Remove an invitation from an island for the player. + * Do not call use this method directly unless you know what you're doing. + * Instead, use {@link Island#revokeInvite(SuperiorPlayer)} (SuperiorPlayer)} + * + * @param island The island to remove the invitation from. + */ + void removeInvite(Island island); + + /** + * Get all pending invites of the player. + * + * @return Pending invites, in the same order they were sent. + */ + List getInvites(); + /** * Get the role of the player. */ diff --git a/src/main/java/com/bgsoftware/superiorskyblock/commands/player/CmdAccept.java b/src/main/java/com/bgsoftware/superiorskyblock/commands/player/CmdAccept.java index 24ec0013e..133eee905 100644 --- a/src/main/java/com/bgsoftware/superiorskyblock/commands/player/CmdAccept.java +++ b/src/main/java/com/bgsoftware/superiorskyblock/commands/player/CmdAccept.java @@ -3,14 +3,13 @@ import com.bgsoftware.superiorskyblock.SuperiorSkyblockPlugin; import com.bgsoftware.superiorskyblock.api.island.Island; import com.bgsoftware.superiorskyblock.api.wrappers.SuperiorPlayer; -import com.bgsoftware.superiorskyblock.core.messages.Message; import com.bgsoftware.superiorskyblock.commands.CommandTabCompletes; import com.bgsoftware.superiorskyblock.commands.ISuperiorCommand; -import com.bgsoftware.superiorskyblock.island.role.SPlayerRole; +import com.bgsoftware.superiorskyblock.core.messages.Message; import com.bgsoftware.superiorskyblock.island.IslandUtils; +import com.bgsoftware.superiorskyblock.island.role.SPlayerRole; import org.bukkit.command.CommandSender; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -29,9 +28,9 @@ public String getPermission() { @Override public String getUsage(java.util.Locale locale) { - return "accept <" + + return "accept [" + Message.COMMAND_ARGUMENT_PLAYER_NAME.getMessage(locale) + "/" + - Message.COMMAND_ARGUMENT_ISLAND_NAME.getMessage(locale) + ">"; + Message.COMMAND_ARGUMENT_ISLAND_NAME.getMessage(locale) + "]"; } @Override @@ -41,7 +40,7 @@ public String getDescription(java.util.Locale locale) { @Override public int getMinArgs() { - return 2; + return 1; } @Override @@ -57,19 +56,22 @@ public boolean canBeExecutedByConsole() { @Override public void execute(SuperiorSkyblockPlugin plugin, CommandSender sender, String[] args) { SuperiorPlayer superiorPlayer = plugin.getPlayers().getSuperiorPlayer(sender); - SuperiorPlayer targetPlayer = plugin.getPlayers().getSuperiorPlayer(args[1]); + + SuperiorPlayer targetPlayer; Island island; - if (targetPlayer == null) { - if ((island = plugin.getGrid().getIsland(args[1])) == null || !island.isInvited(superiorPlayer)) { - Message.NO_ISLAND_INVITE.send(superiorPlayer); - return; - } + if (args.length == 1) { + List playerPendingInvites = superiorPlayer.getInvites(); + island = playerPendingInvites.isEmpty() ? null : playerPendingInvites.get(0); + targetPlayer = null; } else { - if ((island = targetPlayer.getIsland()) == null || !island.isInvited(superiorPlayer)) { - Message.NO_ISLAND_INVITE.send(superiorPlayer); - return; - } + targetPlayer = plugin.getPlayers().getSuperiorPlayer(args[1]); + island = targetPlayer == null ? plugin.getGrid().getIsland(args[1]) : targetPlayer.getIsland(); + } + + if (island == null || !island.isInvited(superiorPlayer)) { + Message.NO_ISLAND_INVITE.send(superiorPlayer); + return; } if (superiorPlayer.getIsland() != null) { diff --git a/src/main/java/com/bgsoftware/superiorskyblock/island/SIsland.java b/src/main/java/com/bgsoftware/superiorskyblock/island/SIsland.java index 79dcb02ee..b643ce131 100644 --- a/src/main/java/com/bgsoftware/superiorskyblock/island/SIsland.java +++ b/src/main/java/com/bgsoftware/superiorskyblock/island/SIsland.java @@ -429,8 +429,8 @@ public List> getUniqueVisitorsWithTimes() { public void inviteMember(SuperiorPlayer superiorPlayer) { Preconditions.checkNotNull(superiorPlayer, "superiorPlayer parameter cannot be null."); PluginDebugger.debug("Action: Invite, Island: " + owner.getName() + ", Target: " + superiorPlayer.getName()); - invitedPlayers.add(superiorPlayer); + superiorPlayer.addInvite(this); //Revoke the invite after 5 minutes BukkitExecutor.sync(() -> revokeInvite(superiorPlayer), 6000L); } @@ -439,8 +439,8 @@ public void inviteMember(SuperiorPlayer superiorPlayer) { public void revokeInvite(SuperiorPlayer superiorPlayer) { Preconditions.checkNotNull(superiorPlayer, "superiorPlayer parameter cannot be null."); PluginDebugger.debug("Action: Invite Revoke, Island: " + owner.getName() + ", Target: " + superiorPlayer.getName()); - invitedPlayers.remove(superiorPlayer); + superiorPlayer.removeInvite(this); } @Override @@ -1271,6 +1271,8 @@ public void disbandIsland() { }).forEach(superiorPlayer::resetMission); }); + invitedPlayers.forEach(invitedPlayer -> invitedPlayer.removeInvite(this)); + if (BuiltinModules.BANK.disbandRefund > 0) plugin.getProviders().depositMoney(getOwner(), islandBank.getBalance() .multiply(BigDecimal.valueOf(BuiltinModules.BANK.disbandRefund))); diff --git a/src/main/java/com/bgsoftware/superiorskyblock/player/SSuperiorPlayer.java b/src/main/java/com/bgsoftware/superiorskyblock/player/SSuperiorPlayer.java index 3c4b3dcc2..c55e97a96 100644 --- a/src/main/java/com/bgsoftware/superiorskyblock/player/SSuperiorPlayer.java +++ b/src/main/java/com/bgsoftware/superiorskyblock/player/SSuperiorPlayer.java @@ -38,6 +38,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; @@ -56,6 +57,8 @@ public class SSuperiorPlayer implements SuperiorPlayer { private PersistentDataContainer persistentDataContainer; // Lazy loading private final Map, Integer> completedMissions = new ConcurrentHashMap<>(); + private final List pendingInvites = new LinkedList<>(); + private final UUID uuid; private Island playerIsland = null; @@ -433,6 +436,22 @@ public boolean hasIsland() { return getIsland() != null; } + @Override + public void addInvite(Island island) { + this.pendingInvites.add(island.getUniqueId()); + } + + @Override + public void removeInvite(Island island) { + this.pendingInvites.remove(island.getUniqueId()); + } + + @Override + public List getInvites() { + return new SequentialListBuilder() + .map(this.pendingInvites, uuid -> plugin.getGrid().getIslandByUUID(uuid)); + } + @Override public PlayerRole getPlayerRole() { if (playerRole == null) diff --git a/src/main/java/com/bgsoftware/superiorskyblock/player/SuperiorNPCPlayer.java b/src/main/java/com/bgsoftware/superiorskyblock/player/SuperiorNPCPlayer.java index f765e774d..d98b82da4 100644 --- a/src/main/java/com/bgsoftware/superiorskyblock/player/SuperiorNPCPlayer.java +++ b/src/main/java/com/bgsoftware/superiorskyblock/player/SuperiorNPCPlayer.java @@ -216,6 +216,21 @@ public boolean hasIsland() { return false; } + @Override + public void addInvite(Island island) { + // Do nothing. + } + + @Override + public void removeInvite(Island island) { + // Do nothing. + } + + @Override + public List getInvites() { + return Collections.emptyList(); + } + @Override public PlayerRole getPlayerRole() { return SPlayerRole.guestRole();