This commit is contained in:
Tastybento 2017-12-14 08:18:33 -08:00
parent 461585aebd
commit fd8c48bbd6
10 changed files with 389 additions and 48 deletions

View File

@ -3,7 +3,7 @@ package us.tastybento.bskyblock.commands;
import org.bukkit.command.CommandSender;
import us.tastybento.bskyblock.api.commands.CompositeCommand;
import us.tastybento.bskyblock.commands.island.IslandAboutCommand;
import us.tastybento.bskyblock.commands.island.IslandTeamCommand;
import us.tastybento.bskyblock.commands.island.teams.IslandTeamCommand;
import us.tastybento.bskyblock.config.Settings;
public class IslandCommand extends CompositeCommand {

View File

@ -1,18 +1,58 @@
package us.tastybento.bskyblock.commands.island;
package us.tastybento.bskyblock.commands.island.teams;
import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import us.tastybento.bskyblock.api.commands.CommandArgument;
import us.tastybento.bskyblock.config.Settings;
import us.tastybento.bskyblock.util.VaultHelper;
public abstract class AbstractIslandTeamCommandArgument extends CommandArgument {
protected final static boolean DEBUG = false;
protected BiMap<UUID, UUID> inviteList = HashBiMap.create();
// The time a player has to wait until they can reset their island again
protected HashMap<UUID, Long> resetWaitTime = new HashMap<>();
protected Set<UUID> leavingPlayers = new HashSet<>();
protected Set<UUID> kickingPlayers = new HashSet<>();
protected CommandSender sender;
protected Player player;
protected UUID playerUUID;
public AbstractIslandTeamCommandArgument(String label, String... aliases) {
super(label,aliases);
}
protected boolean checkTeamPerm() {
if (!isPlayer(sender)) {
sender.sendMessage(getLocale(sender).get("general.errors.use-in-game"));
return false;
}
player = (Player)sender;
playerUUID = player.getUniqueId();
if (!VaultHelper.hasPerm(player, Settings.PERMPREFIX + "team")) {
sender.sendMessage(ChatColor.RED + getLocale(sender).get("general.errors.no-permission"));
return false;
}
return true;
}
/**
* Sets a timeout for player into the Hashmap resetWaitTime
*
* @param player
*/
protected void setResetWaitTime(final Player player) {
resetWaitTime.put(player.getUniqueId(), Calendar.getInstance().getTimeInMillis() + Settings.resetWait * 1000);
}
}

View File

@ -1,4 +1,105 @@
package us.tastybento.bskyblock.commands.island;
package us.tastybento.bskyblock.commands.island.teams;
public class IslandInviteAcceptCommand {
import java.util.Set;
import java.util.UUID;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import us.tastybento.bskyblock.api.events.team.TeamEvent;
import us.tastybento.bskyblock.api.events.team.TeamEvent.TeamReason;
import us.tastybento.bskyblock.config.Settings;
import us.tastybento.bskyblock.database.objects.Island;
public class IslandInviteAcceptCommand extends AbstractIslandTeamCommandArgument {
public IslandInviteAcceptCommand() {
super("accept");
}
@Override
public boolean execute(CommandSender sender, String[] args) {
// Check team perm and get variables set
if (!checkTeamPerm()) return true;
if(!inviteList.containsKey(playerUUID))
return true;
// Check if player has been invited
if (!inviteList.containsKey(playerUUID)) {
player.sendMessage(ChatColor.RED + getLocale(sender).get("invite.error.NoOneInvitedYou"));
return true;
}
// Check if player is already in a team
if (getPlayers().inTeam(playerUUID)) {
player.sendMessage(ChatColor.RED + getLocale(sender).get("invite.error.YouAreAlreadyOnATeam"));
return true;
}
// Get the team leader
UUID prospectiveTeamLeaderUUID = inviteList.get(playerUUID);
if (!getIslands().hasIsland(prospectiveTeamLeaderUUID)) {
player.sendMessage(ChatColor.RED + getLocale(sender).get("invite.error.InvalidInvite"));
inviteList.remove(playerUUID);
return true;
}
if (DEBUG)
plugin.getLogger().info("DEBUG: Invite is valid");
// Fire event so add-ons can run commands, etc.
TeamEvent event = TeamEvent.builder()
.island(getIslands()
.getIsland(prospectiveTeamLeaderUUID))
.reason(TeamReason.JOIN)
.involvedPlayer(playerUUID)
.build();
plugin.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) return true;
// Remove the invite
if (DEBUG)
plugin.getLogger().info("DEBUG: Removing player from invite list");
inviteList.remove(playerUUID);
// Put player into Spectator mode
player.setGameMode(GameMode.SPECTATOR);
// Get the player's island - may be null if the player has no island
Island island = getIslands().getIsland(playerUUID);
// Get the team's island
Island teamIsland = getIslands().getIsland(prospectiveTeamLeaderUUID);
// Clear the player's inventory
player.getInventory().clear();
// Move player to team's island
Location newHome = getIslands().getSafeHomeLocation(prospectiveTeamLeaderUUID, 1);
player.teleport(newHome);
// Remove player as owner of the old island
getIslands().removePlayer(playerUUID);
// Add the player as a team member of the new island
getIslands().setJoinTeam(teamIsland, playerUUID);
// Set the player's home
getPlayers().setHomeLocation(playerUUID, player.getLocation());
// Delete the old island
getIslands().deleteIsland(island, true);
// Set the cooldown
setResetWaitTime(player);
// Reset deaths
if (Settings.teamJoinDeathReset) {
getPlayers().setDeaths(playerUUID, 0);
}
// Put player back into normal mode
player.setGameMode(GameMode.SURVIVAL);
player.sendMessage(ChatColor.GREEN + getLocale(sender).get("invite.youHaveJoinedAnIsland").replace("[label]", Settings.ISLANDCOMMAND));
if (plugin.getServer().getPlayer(inviteList.get(playerUUID)) != null) {
plugin.getServer().getPlayer(inviteList.get(playerUUID)).sendMessage(
ChatColor.GREEN + getLocale(sender).get("invite.hasJoinedYourIsland").replace("[name]", player.getName()));
}
getIslands().save(false);
if (DEBUG)
plugin.getLogger().info("DEBUG: After save " + getIslands().getIsland(prospectiveTeamLeaderUUID).getMembers().toString());
return true;
}
@Override
public Set<String> tabComplete(CommandSender sender, String[] args) {
return null;
}
}

View File

@ -1,4 +1,55 @@
package us.tastybento.bskyblock.commands.island;
package us.tastybento.bskyblock.commands.island.teams;
public class IslandInviteRejectCommand {
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import us.tastybento.bskyblock.api.events.team.TeamEvent;
import us.tastybento.bskyblock.api.events.team.TeamEvent.TeamReason;
public class IslandInviteRejectCommand extends AbstractIslandTeamCommandArgument {
public IslandInviteRejectCommand() {
super("reject");
}
@Override
public boolean execute(CommandSender sender, String[] args) {
// Check team perm and get variables set
if (!checkTeamPerm()) return true;
// Reject /island reject
if (inviteList.containsKey(playerUUID)) {
// Fire event so add-ons can run commands, etc.
TeamEvent event = TeamEvent.builder()
.island(getIslands()
.getIsland(inviteList.get(playerUUID)))
.reason(TeamReason.REJECT)
.involvedPlayer(playerUUID)
.build();
plugin.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) return true;
// Remove this player from the global invite list
inviteList.remove(player.getUniqueId());
player.sendMessage(ChatColor.GREEN + getLocale(playerUUID).get("reject.youHaveRejectedInvitation"));
// If the leader is online tell them directly
// about the rejection
if (Bukkit.getPlayer(inviteList.get(playerUUID)) != null) {
Bukkit.getPlayer(inviteList.get(playerUUID)).sendMessage(
ChatColor.RED + getLocale(playerUUID).get("reject.nameHasRejectedInvite").replace("[name]", player.getName()));
}
} else {
// Someone typed /island reject and had not been invited
player.sendMessage(ChatColor.RED + getLocale(playerUUID).get("reject.youHaveNotBeenInvited"));
}
return true;
}
@Override
public Set<String> tabComplete(CommandSender sender, String[] args) {
return null;
}
}

View File

@ -1,4 +1,25 @@
package us.tastybento.bskyblock.commands.island;
package us.tastybento.bskyblock.commands.island.teams;
public class IslandLeaveCommand {
}
import java.util.Set;
import org.bukkit.command.CommandSender;
public class IslandLeaveCommand extends AbstractIslandTeamCommandArgument {
public IslandLeaveCommand(String label, String[] aliases) {
super(label, aliases);
// TODO Auto-generated constructor stub
}
@Override
public boolean execute(CommandSender sender, String[] args) {
// TODO Auto-generated method stub
return false;
}
@Override
public Set<String> tabComplete(CommandSender sender, String[] args) {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -1,4 +1,4 @@
package us.tastybento.bskyblock.commands.island;
package us.tastybento.bskyblock.commands.island.teams;
import java.util.Set;
import java.util.UUID;
@ -6,16 +6,13 @@ import java.util.UUID;
import org.apache.commons.lang.math.NumberUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachmentInfo;
import us.tastybento.bskyblock.api.commands.CommandArgument;
import us.tastybento.bskyblock.api.events.team.TeamEvent;
import us.tastybento.bskyblock.api.events.team.TeamEvent.TeamReason;
import us.tastybento.bskyblock.config.Settings;
import us.tastybento.bskyblock.util.VaultHelper;
public class IslandTeamCommand extends CommandArgument {
public class IslandTeamCommand extends AbstractIslandTeamCommandArgument {
private static final boolean DEBUG = false;
@ -26,16 +23,9 @@ public class IslandTeamCommand extends CommandArgument {
@Override
public boolean execute(CommandSender sender, String[] args) {
if (!isPlayer(sender)) {
sender.sendMessage(getLocale(sender).get("general.errors.use-in-game"));
return true;
}
Player player = (Player)sender;
UUID playerUUID = player.getUniqueId();
if (!VaultHelper.hasPerm(player, Settings.PERMPREFIX + "team")) {
sender.sendMessage(ChatColor.RED + getLocale(sender).get("general.errors.no-permission"));
return true;
}
// Check team perm and get variables set
if (!checkTeamPerm()) return true;
if (DEBUG)
plugin.getLogger().info("DEBUG: executing team command for " + playerUUID);
// Fire event so add-ons can run commands, etc.

View File

@ -1,4 +1,4 @@
package us.tastybento.bskyblock.commands.island;
package us.tastybento.bskyblock.commands.island.teams;
import java.util.HashSet;
import java.util.Set;
@ -16,7 +16,6 @@ import us.tastybento.bskyblock.api.events.team.TeamEvent;
import us.tastybento.bskyblock.api.events.team.TeamEvent.TeamReason;
import us.tastybento.bskyblock.config.Settings;
import us.tastybento.bskyblock.util.Util;
import us.tastybento.bskyblock.util.VaultHelper;
public class IslandTeamInviteCommand extends AbstractIslandTeamCommandArgument {
@ -26,16 +25,9 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommandArgument {
@Override
public boolean execute(CommandSender sender, String[] args) {
if (!isPlayer(sender)) {
sender.sendMessage(getLocale(sender).get("general.errors.use-in-game"));
return true;
}
Player player = (Player)sender;
UUID playerUUID = player.getUniqueId();
if (!VaultHelper.hasPerm(player, Settings.PERMPREFIX + "team")) {
sender.sendMessage(ChatColor.RED + getLocale(sender).get("general.errors.no-permission"));
return true;
}
// Check team perm and get variables set
if (!checkTeamPerm()) return true;
// Player issuing the command must have an island
if (!getPlayers().hasIsland(playerUUID)) {
// If the player is in a team, they are not the leader
@ -46,7 +38,6 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommandArgument {
}
if (args.length == 0 || args.length > 1) {
// Invite label with no name, i.e., /island invite - tells the player who has invited them so far
//TODO
if (inviteList.containsKey(playerUUID)) {
OfflinePlayer inviter = plugin.getServer().getOfflinePlayer(inviteList.get(playerUUID));
player.sendMessage(ChatColor.GOLD + getLocale(sender).get("invite.nameHasInvitedYou").replace("[name]", inviter.getName()));

View File

@ -1,4 +1,25 @@
package us.tastybento.bskyblock.commands.island;
package us.tastybento.bskyblock.commands.island.teams;
public class IslandTeamKickCommand {
}
import java.util.Set;
import org.bukkit.command.CommandSender;
public class IslandTeamKickCommand extends AbstractIslandTeamCommandArgument {
public IslandTeamKickCommand(String label, String[] aliases) {
super(label, aliases);
// TODO Auto-generated constructor stub
}
@Override
public boolean execute(CommandSender sender, String[] args) {
// TODO Auto-generated method stub
return false;
}
@Override
public Set<String> tabComplete(CommandSender sender, String[] args) {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -1,4 +1,134 @@
package us.tastybento.bskyblock.commands.island;
package us.tastybento.bskyblock.commands.island.teams;
public class IslandTeamPromoteCommand {
}
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import org.apache.commons.lang.math.NumberUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachmentInfo;
import us.tastybento.bskyblock.api.events.team.TeamEvent;
import us.tastybento.bskyblock.api.events.team.TeamEvent.TeamReason;
import us.tastybento.bskyblock.config.Settings;
import us.tastybento.bskyblock.database.objects.Island;
public class IslandTeamPromoteCommand extends AbstractIslandTeamCommandArgument {
public IslandTeamPromoteCommand() {
super("promote", "makeleader");
}
@Override
public boolean execute(CommandSender sender, String[] args) {
// Check team perm and get variables set
if (!checkTeamPerm()) return true;
// Can use if in a team
boolean inTeam = plugin.getPlayers().inTeam(playerUUID);
UUID teamLeaderUUID = plugin.getIslands().getTeamLeader(playerUUID);
if (!(inTeam && teamLeaderUUID.equals(playerUUID))) {
return true;
}
plugin.getLogger().info("DEBUG: arg[0] = " + args[0]);
UUID targetUUID = getPlayers().getUUID(args[0]);
if (targetUUID == null) {
player.sendMessage(ChatColor.RED + getLocale(playerUUID).get("general.errors.unknown-player"));
return true;
}
if (!getPlayers().inTeam(playerUUID)) {
player.sendMessage(ChatColor.RED + getLocale(playerUUID).get("makeleader.errorYouMustBeInTeam"));
return true;
}
if (!teamLeaderUUID.equals(playerUUID)) {
player.sendMessage(ChatColor.RED + getLocale(playerUUID).get("makeleader.errorNotYourIsland"));
return true;
}
if (targetUUID.equals(playerUUID)) {
player.sendMessage(ChatColor.RED + getLocale(playerUUID).get("makeleader.errorGeneralError"));
return true;
}
if (!plugin.getIslands().getMembers(playerUUID).contains(targetUUID)) {
player.sendMessage(ChatColor.RED + getLocale(playerUUID).get("makeleader.errorThatPlayerIsNotInTeam"));
return true;
}
// Fire event so add-ons can run commands, etc.
TeamEvent event = TeamEvent.builder().island(getIslands().getIsland(playerUUID)).reason(TeamReason.MAKELEADER).involvedPlayer(targetUUID).build();
plugin.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) return true;
// target is the new leader
getIslands().getIsland(playerUUID).setOwner(targetUUID);
player.sendMessage(ChatColor.GREEN
+ getLocale(playerUUID).get("makeleader.nameIsNowTheOwner").replace("[name]", getPlayers().getName(targetUUID)));
// Check if online
Player target = plugin.getServer().getPlayer(targetUUID);
if (target == null) {
// TODO offline messaging
//plugin.getMessages().setMessage(targetPlayer, getLocale(playerUUID).get("makeleader.youAreNowTheOwner"));
} else {
// Online
plugin.getServer().getPlayer(targetUUID).sendMessage(ChatColor.GREEN + getLocale(targetUUID).get("makeleader.youAreNowTheOwner"));
// Check if new leader has a lower range permission than the island size
boolean hasARangePerm = false;
int range = Settings.islandProtectionRange;
// Check for zero protection range
Island islandByOwner = getIslands().getIsland(targetUUID);
if (islandByOwner.getProtectionRange() == 0) {
plugin.getLogger().warning("Player " + player.getName() + "'s island had a protection range of 0. Setting to default " + range);
islandByOwner.setProtectionRange(range);
}
for (PermissionAttachmentInfo perms : target.getEffectivePermissions()) {
if (perms.getPermission().startsWith(Settings.PERMPREFIX + "island.range.")) {
if (perms.getPermission().contains(Settings.PERMPREFIX + "island.range.*")) {
// Ignore
break;
} else {
String[] spl = perms.getPermission().split(Settings.PERMPREFIX + "island.range.");
if (spl.length > 1) {
if (!NumberUtils.isDigits(spl[1])) {
plugin.getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring...");
} else {
hasARangePerm = true;
range = Math.max(range, Integer.valueOf(spl[1]));
}
}
}
}
}
// Only set the island range if the player has a perm to override the default
if (hasARangePerm) {
// Do some sanity checking
if (range % 2 != 0) {
range--;
}
// Get island range
// Range can go up or down
if (range != islandByOwner.getProtectionRange()) {
player.sendMessage(getLocale(targetUUID).get("admin.SetRangeUpdated").replace("[number]", String.valueOf(range)));
target.sendMessage(getLocale(targetUUID).get("admin.SetRangeUpdated").replace("[number]", String.valueOf(range)));
plugin.getLogger().info(
"Makeleader: Island protection range changed from " + islandByOwner.getProtectionRange() + " to "
+ range + " for " + player.getName() + " due to permission.");
}
islandByOwner.setProtectionRange(range);
}
}
getIslands().save(true);
return true;
}
@Override
public Set<String> tabComplete(CommandSender sender, String[] args) {
Set<String> result = new HashSet<>();
for (UUID member : plugin.getIslands().getMembers(playerUUID)) {
result.add(plugin.getServer().getOfflinePlayer(member).getName());
}
return result;
}
}

View File

@ -1,4 +1,4 @@
package us.tastybento.bskyblock.commands.island;
package us.tastybento.bskyblock.commands.island.teams;
import java.util.Set;
import java.util.UUID;
@ -30,9 +30,6 @@ public class IslandTeamUninviteCommand extends AbstractIslandTeamCommandArgument
sender.sendMessage(ChatColor.RED + getLocale(sender).get("general.errors.no-permission"));
return true;
}
// Get the invite list
// TODO
// Can only use if you have an invite out there
if(!inviteList.inverse().containsKey(playerUUID)) {
return true;
@ -62,7 +59,6 @@ public class IslandTeamUninviteCommand extends AbstractIslandTeamCommandArgument
@Override
public Set<String> tabComplete(CommandSender sender, String[] args) {
// TODO Auto-generated method stub
return null;
}
}