package me.gtacraft.plugins.gangs.commands;
import com.google.common.collect.Lists;
import me.gtacraft.plugins.gangs.*;
import me.gtacraft.plugins.gangs.database.SQLVars;
import me.gtacraft.plugins.gangs.enumeration.GangRole;
import me.gtacraft.plugins.gangs.listeners.GTAMovementListener;
import me.gtacraft.plugins.gangs.util.Formatting;
import me.gtacraft.plugins.gangs.util.MessageType;
import me.gtacraft.plugins.gangs.util.Util;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Connor on 6/30/14. Designed for the GTA-Factions project.
*/
public class UserCommands {
public UserCommands() {
CommandHandler.getInstance().registerCommandChannel(this);
}
@CommandHandler.CommandContext(name="create",aliases={"creategang", "newgang"},help="&5&l/gang create [name] &e- &fCreate a gang with the given name")
public void createGangCommand(final Player player, final String[] args) {
Runnable async = new Runnable() {
@Override
public void run() {
GangMember member = GangMember.fromPlayer(player);
if (!(player.hasPermission("gangs.user"))) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You do not have permission to use this command!")));
return;
}
if (args.length == 0) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "Please specify a gang name!")));
return;
}
if (member.getGang() != null) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You must leave your current gang in order to create a new one!")));
return;
}
if (GangManager.getGang(args[0]) != null) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "A gang with the name &7"+args[0]+" &falready exists!")));
return;
}
if (args[0].length() > 10) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You cannot have a gang name longer than 10 characters!")));
return;
}
Gang create = new Gang(new ArrayList<OfflinePlayer>(), args[0], 0);
create.getOnlineMembers().add(member);
create.getAllMembers().add(player);
GTAGangs.sql_query.add(SQLVars.INSERT_NEW_GANG.replace("%name%", args[0])
.replace("%members%", Util.fromMembers(create.getAllMembers()))
.replace("%friendly_fire%", "0"));
member.setRole(GangRole.LEADER);
member.setGang(create);
GTAGangs.sql_query.add(SQLVars.UPDATE_PLAYER
.replace("%uuid%", player.getUniqueId().toString())
.replace("%gang%", args[0])
.replace("%role%", member.getRole().getPermissionLevel() + ""));
GangManager.insertGang(create);
player.sendMessage(Formatting.formatMessage(MessageType.SUCCESS.getPattern().replace("%m%", "You created the gang &7"+args[0]+"&f!")));
}
};
Bukkit.getScheduler().scheduleAsyncDelayedTask(GTAGangs.getInstance(), async);
}
@CommandHandler.CommandContext(name="leave",aliases={"l"},help="&5&l/gang leave &e- &fLeave your current gang")
public void leaveGangCommand(final Player player, final String[] args) {
Runnable async = new Runnable() {
public void run() {
GangMember member = GangMember.fromPlayer(player);
if (!(player.hasPermission("gangs.user"))) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You do not have permission to use this command!")));
return;
}
Gang gang = member.getGang();
if (gang == null) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You must be in a gang to leave one!")));
return;
}
boolean ownedGang = member.getRole().equals(GangRole.LEADER);
if (ownedGang) {
//delete gang and kick members...
List<OfflinePlayer> inGang = gang.getAllMembers();
for (OfflinePlayer kick : inGang) {
GTAGangs.sql_query.add(SQLVars.REMOVE_PLAYER_FROM_GANG.replace("%uuid%", kick.getUniqueId().toString()));
if (kick.isOnline()) {
GangMember.fromPlayer(kick).setGang(null);
GangMember.fromPlayer(kick).setRole(null);
kick.getPlayer().sendMessage(Formatting.formatMessage(MessageType.WARNING.getPattern().replace("%m%", "The gang that you were in is now disbanded! You are forever alone ;(")));
}
}
GTAGangs.sql_query.add(SQLVars.DELETE_GANG.replace("%name%", gang.getName()));
GangManager.removeGang(gang);
} else {
GTAGangs.sql_query.add(SQLVars.REMOVE_PLAYER_FROM_GANG.replace("%uuid%", player.getUniqueId().toString()));
player.sendMessage(Formatting.formatMessage(MessageType.SUCCESS.getPattern().replace("%m%", "You left your gang! &e;(")));
for (GangMember goodbye : gang.getOnlineMembers()) {
goodbye.getWrapped().getPlayer().sendMessage(Formatting.formatMessage(MessageType.WARNING.getPattern().replace("%m%", "&7"+player.getName()+" &fhas left the gang! :o")));
}
member.setGang(null);
member.setRole(null);
gang.getOnlineMembers().remove(player);
gang.getAllMembers().remove(player);
}
}
};
Bukkit.getScheduler().scheduleAsyncDelayedTask(GTAGangs.getInstance(), async);
}
@CommandHandler.CommandContext(name="join", aliases={"j"}, help="&5&l/gang join [name] &e- &fJoin the given gang if invited")
public void joinGangCommand(final Player player, final String[] args) {
Runnable async = new Runnable() {
public void run() {
GangMember member = GangMember.fromPlayer(player);
if (!(player.hasPermission("gangs.user"))) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You do not have permission to use this command!")));
return;
}
Gang gang$ = member.getGang();
if (gang$ != null) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You must leave your current gang before joining another one!")));
return;
}
if (args.length == 0) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "Please specify a gang name!")));
return;
}
Gang gang = GangManager.getGang(args[0]);
if (gang == null) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "A gang with the name &7"+args[0]+" &fdoes not exist!")));
return;
}
List<Gang> invites = GangInviteManager.findInvites(player);
if (invites == null) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You have no gang invites!")));
return;
}
if (!invites.contains(gang)) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "That gang has not invited you!")));
return;
}
gang.getAllMembers().add(player);
gang.getOnlineMembers().add(member);
GangInviteManager.removeFromInvites(player);
for (GangMember online : gang.getOnlineMembers()) {
online.getWrapped().getPlayer().sendMessage(Formatting.formatMessage(MessageType.SUCCESS.getPattern().replace("%m%", "&7"+player.getName()+" &fhas joined the gang!")));
}
member.setRole(GangRole.MEMBER);
member.setGang(gang);
GTAGangs.sql_query.add(SQLVars.UPDATE_PLAYER
.replace("%gang%", gang.getName())
.replace("%role%", member.getRole().getPermissionLevel()+"")
.replace("%uuid%", player.getUniqueId().toString()));
}
};
Bukkit.getScheduler().scheduleAsyncDelayedTask(GTAGangs.getInstance(), async);
}
@CommandHandler.CommandContext(name="chat",aliases={"togglegangchat", "togglechat", "gangchat"}, help="&5&l/gang chat &e- &fToggle gang chat mode")
public void toggleGangChatCommand(final Player player, String[] args) {
Runnable async = new Runnable() {
public void run() {
GangMember member = GangMember.fromPlayer(player);
if (!(player.hasPermission("gangs.user"))) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You do not have permission to use this command!")));
return;
}
Gang gang = member.getGang();
if (gang == null) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You must be in a gang to use gang chat!")));
return;
}
member.setGangChat(!(member.isGangChat()));
player.sendMessage(Formatting.formatMessage(MessageType.INFO.getPattern().replace("%m%", "You switched "+(member.isGangChat() ? "&7into" : "&7out of")+" &fgang chat!")));
}
};
Bukkit.getScheduler().scheduleAsyncDelayedTask(GTAGangs.getInstance(), async);
}
@CommandHandler.CommandContext(name="hideout",aliases={"home"},help="&5&l/gang hideout &e- &fTeleport to your gang hideout")
public void goToHideoutCommand(final Player player, String[] args) {
Runnable async = new Runnable() {
public void run() {
GangMember member = GangMember.fromPlayer(player);
if (!(player.hasPermission("gangs.user"))) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You do not have permission to use this command!")));
return;
}
final Gang gang = member.getGang();
if (gang == null) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You must be in a gang to use gang chat!")));
return;
}
if (gang.getHideout() == null) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "Your gang does not have a hideout set!")));
return;
}
if (GTAMovementListener.going_home.contains(player)) {
player.sendMessage(Formatting.formatMessage(MessageType.INFO.getPattern().replace("%m%", "You are already teleporting to your hideout!")));
return;
}
GTAMovementListener.going_home.add(player);
player.sendMessage(Formatting.formatMessage(MessageType.INFO.getPattern().replace("%m%", "Teleportation will commence in &7"+GTAGangs.TELEPORT_TIME+"&f seconds! Do not move!")));
Runnable sync = new Runnable() {
public void run() {
if (GTAMovementListener.going_home.contains(player)) {
//teleport
if (player.isOnline()) {
player.teleport(gang.getHideout());
player.sendMessage(Formatting.formatMessage(MessageType.SUCCESS.getPattern().replace("%m%", "Teleportation successful!")));
}
GTAMovementListener.going_home.remove(player);
}
}
};
Bukkit.getScheduler().scheduleSyncDelayedTask(GTAGangs.getInstance(), sync, 20*(GTAGangs.TELEPORT_TIME));
}
};
Bukkit.getScheduler().scheduleAsyncDelayedTask(GTAGangs.getInstance(), async);
}
@CommandHandler.CommandContext(name="list", aliases={"listgangs", "all"}, help="&5&l/gang list &e- &fDisplays a list of all the possible gangs")
public void listGangsCommand(final Player player, final String[] args) {
Runnable async = new Runnable() {
public void run() {
if (!(player.hasPermission("gangs.user"))) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You do not have permission to use this command!")));
return;
}
//page based loading
int page = 1;
if (args.length != 0) {
try { page = Integer.parseInt(args[0]); } catch (NumberFormatException err) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "&7"+args[0]+" &fis not a valid page!")));
return;
}
}
page--;
List<Gang> gangs = GangManager.getGangs();
List<Gang> range = Lists.newArrayList();
for (int i = page*8; i < (page*8)+8; i++) {
if (i >= gangs.size())
range.add(null);
else
range.add(gangs.get(i));
}
if (range.size() == 0) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "Nothing to show on this page!")));
return;
}
player.sendMessage(Formatting.formatMessage("&e&m-----&r &5&lGangs &e&m-----"));
int pos = page*10;
for (Gang inRange : range) {
pos++;
if (inRange == null)
player.sendMessage("");
else
player.sendMessage(Formatting.formatMessage("&5&l"+pos+" &eGang: &f"+inRange.getName()+"&e, Players: &f"+inRange.getAllMembers().size()));
}
player.sendMessage(Formatting.formatMessage("&e&m-----&r &5/gang list "+(page+2)+" &5for the next page &e&m-----"));
}
};
Bukkit.getScheduler().scheduleAsyncDelayedTask(GTAGangs.getInstance(), async);
}
@CommandHandler.CommandContext(name="who", aliases={"whois", "g", "what"}, help="&5&l/gang who [gang] &e- &fDisplay general information about the given player / gang")
public void whoCommand(final Player player, final String[] args) {
Runnable async = new Runnable() {
public void run() {
if (!(player.hasPermission("gangs.user"))) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "You do not have permission to use this command!")));
return;
}
if (args.length == 0) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "Please specify a gang or a player to search!")));
return;
}
//begin search
boolean isPlayer = Bukkit.getOfflinePlayer(args[0]).hasPlayedBefore();
Gang display = null;
if (!isPlayer) {
//find gang
display = GangManager.getGang(args[0]);
if (display == null) {
player.sendMessage(Formatting.formatMessage(MessageType.ERROR.getPattern().replace("%m%", "The given gang does not exist!")));
return;
}
} else {
//find player
OfflinePlayer data = Bukkit.getOfflinePlayer(args[0]);
String found = SQLVars.getGang(data);
if (found == null) {
player.sendMessage(Formatting.formatMessage(MessageType.INFO.getPattern().replace("%m%", "This player is not in any gang!")));
return;
}
display = GangManager.getGang(found);
}
player.sendMessage(Formatting.formatMessage("&e&m----- &5&lGang lookup &e&m-----"));
player.sendMessage("");
player.sendMessage(Formatting.formatMessage("&5&lGang&e: &f"+display.getName()));
String players = "";
for (OfflinePlayer p : display.getAllMembers()) {
if (p.isOnline())
players+="&a"+p.getName()+"&f, ";
else if (!(p.hasPlayedBefore()))
players+="&fHasn't joined yet, ";
else
players+="&f"+p.getName()+", ";
}
player.sendMessage(Formatting.formatMessage("&5&lPlayers&e: &f"+players.substring(0, players.length()-2)));
player.sendMessage("");
player.sendMessage(Formatting.formatMessage("&e&m----- &5&lGang lookup &e&m-----"));
}
};
Bukkit.getScheduler().scheduleAsyncDelayedTask(GTAGangs.getInstance(), async);
}
}