diff --git a/src/de/steamwar/bungeecore/commands/TeamCommand.java b/src/de/steamwar/bungeecore/commands/TeamCommand.java index a1ca995..abebce2 100644 --- a/src/de/steamwar/bungeecore/commands/TeamCommand.java +++ b/src/de/steamwar/bungeecore/commands/TeamCommand.java @@ -38,6 +38,7 @@ import net.md_5.bungee.api.connection.ProxiedPlayer; import java.time.Instant; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.stream.Collectors; import static de.steamwar.bungeecore.Storage.teamInvitations; @@ -90,13 +91,14 @@ public class TeamCommand extends BasicCommand { Message.send("TEAM_HELP_LEAVE", sender); Team team = Team.get(user.getTeam()); - if(team.getTeamLeader() == user.getId()){ + if(user.isLeader()){ Message.send("TEAM_HELP_INVITE", sender); Message.send("TEAM_HELP_REMOVE", sender); Message.send("TEAM_HELP_KUERZEL", sender); Message.send("TEAM_HELP_NAME", sender); Message.send("TEAM_HELP_COLOR", sender); Message.send("TEAM_HELP_LEADER", sender); + Message.send("TEAM_HELP_STEP_BACK", sender); } } } @@ -122,6 +124,9 @@ public class TeamCommand extends BasicCommand { case "join": join(player, user, args); break; + case "stepback": + stepBack(player,user,team); + break; case "leave": leave(player, user, team); break; @@ -137,8 +142,8 @@ public class TeamCommand extends BasicCommand { case "changename": changename(player, user, team, args); break; - case "changeleader": - changeleader(player, user, team, args); + case "promote": + promote(player, user, team, args); break; case "changecolor": changeColor(player, user, team); @@ -225,18 +230,31 @@ public class TeamCommand extends BasicCommand { Message.send("TEAM_JOIN_JOINED", player, Team.get(t).getTeamName()); } + private void stepBack(ProxiedPlayer player, SteamwarUser user, Team team) { + if(notLeader(player, user, team)) + return; + + if(team.size() > 1 && team.getMembers().stream().map(SteamwarUser::get).filter(member -> user != member).noneMatch(SteamwarUser::isLeader)){ + Message.send("TEAM_OTHER_LEADER_REQUIRED", player); + return; + } + + user.setLeader(false); + Message.send("TEAM_STEP_BACK", player); + } + private void leave(ProxiedPlayer player, SteamwarUser user, Team team){ if(notInTeam(player, user)) return; - if(team.getTeamLeader() == user.getId() && team.size() > 1){ - Message.send("TEAM_LEAVE_OTHER_LEADER", player); + if(team.size() > 1 && user.isLeader() && team.getMembers().stream().map(SteamwarUser::get).filter(member -> user != member).noneMatch(SteamwarUser::isLeader)){ + Message.send("TEAM_OTHER_LEADER_REQUIRED", player); return; } user.setTeam(0); - if(team.getTeamLeader() == user.getId()){ + if(user.isLeader() && team.size() > 0){ team.disband(); } @@ -296,7 +314,7 @@ public class TeamCommand extends BasicCommand { return; } - if (team.getTeamLeader() == target.getId()) { + if (user.isLeader()) { Message.send("TEAM_REMOVE_NOT_LEADER", player); return; } @@ -363,7 +381,7 @@ public class TeamCommand extends BasicCommand { Message.send("TEAM_NAME_CHANGED", player); } - private void changeleader(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){ + private void promote(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){ if(notLeader(player, user, team)) return; @@ -386,8 +404,8 @@ public class TeamCommand extends BasicCommand { return; } - team.setTeamLeader(target.getId()); - Message.send("TEAM_LEADER_CHANGED", player, args[1]); + target.setLeader(true); + Message.send("TEAM_LEADER_PROMOTED", player, args[1]); } private String playerName(SteamwarUser user){ @@ -408,17 +426,15 @@ public class TeamCommand extends BasicCommand { } Message.sendPrefixless("TEAM_INFO_TEAM", player, team.getTeamName(), team.getTeamColor(), team.getTeamKuerzel()); - Message.sendPrefixless("TEAM_INFO_LEADER", player, playerName(SteamwarUser.get(team.getTeamLeader()))); - if(team.getMembers().size() > 1) { - StringBuilder sb = new StringBuilder(); - List members = team.getMembers(); - for (int i : members) { - if (i == team.getTeamLeader()) - continue; - sb.append(playerName(SteamwarUser.get(i))).append(" "); - } - Message.sendPrefixless("TEAM_INFO_MEMBER", player, sb.toString()); + List users = team.getMembers().stream().map(userId -> SteamwarUser.get(userId)).collect(Collectors.toList()); + + Message.sendPrefixless("TEAM_INFO_LEADER", player, getMemberList(users, true)); + + String members = getMemberList(users, false); + + if(members.length() > 0) { + Message.sendPrefixless("TEAM_INFO_MEMBER", player, members); } Set events = TeamTeilnahme.getEvents(team.getTeamId()); @@ -430,6 +446,16 @@ public class TeamCommand extends BasicCommand { } } + private String getMemberList(List users, boolean leaders) { + StringBuilder sb = new StringBuilder(); + for(SteamwarUser user : users) { + if(user.isLeader() == leaders) { + sb.append(playerName(user)).append(" "); + } + } + return sb.toString(); + } + private void list(ProxiedPlayer player, String[] args){ final int TEAMS_PER_PAGE = 10; @@ -458,7 +484,7 @@ public class TeamCommand extends BasicCommand { Team tm = all.get(i); Message.sendPrefixless("TEAM_LIST_TEAM", player, Message.parse("TEAM_LIST_TEAM_HOVER", player), - new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/team info " + tm.getTeamKuerzel()), tm.getTeamColor(), tm.getTeamKuerzel(), tm.getTeamName(), SteamwarUser.get(tm.getTeamLeader()).getUserName()); + new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/team info " + tm.getTeamKuerzel()), tm.getTeamColor(), tm.getTeamKuerzel(), tm.getTeamName()); } TextComponent beforePage = new TextComponent("««"); @@ -593,7 +619,7 @@ public class TeamCommand extends BasicCommand { private boolean notLeader(ProxiedPlayer player, SteamwarUser user, Team team){ if(notInTeam(player, user)) return true; - if(team.getTeamLeader() != user.getId()){ + if(!user.isLeader()){ Message.send("TEAM_NOT_LEADER", player); return true; } @@ -615,6 +641,7 @@ public class TeamCommand extends BasicCommand { tab.add("create"); tab.add("join"); tab.add("invite"); + tab.add("stepback"); tab.add("leave"); tab.add("info"); tab.add("remove"); diff --git a/src/de/steamwar/bungeecore/sql/SteamwarUser.java b/src/de/steamwar/bungeecore/sql/SteamwarUser.java index 1a1aefd..bf11939 100644 --- a/src/de/steamwar/bungeecore/sql/SteamwarUser.java +++ b/src/de/steamwar/bungeecore/sql/SteamwarUser.java @@ -44,6 +44,7 @@ public class SteamwarUser { private String userName; private UserGroup userGroup; private int team; + private boolean leader; private Map punishments; private static final Map usersByName = new HashMap<>(); @@ -66,6 +67,7 @@ public class SteamwarUser { userName = rs.getString("UserName"); userGroup = UserGroup.getUsergroup(rs.getString("UserGroup")); team = rs.getInt("Team"); + leader = rs.getBoolean("Leader"); usersById.put(id, this); usersByName.put(userName.toLowerCase(), this); usersByUUID.put(uuid, this); @@ -127,6 +129,7 @@ public class SteamwarUser { public void setTeam(int team){ this.team = team; SQL.update("Update UserData SET Team = ? WHERE id = ?", team, id); + setLeader(false); } public int getId() { @@ -261,4 +264,13 @@ public class SteamwarUser { throw new SecurityException("Could not load First Join"); } } + + public boolean isLeader() { + return leader; + } + + public void setLeader(boolean leader) { + this.leader = leader; + SQL.update("Update UserData SET Leader = ? WHERE id = ?", leader, id); + } } diff --git a/src/de/steamwar/bungeecore/sql/Team.java b/src/de/steamwar/bungeecore/sql/Team.java index 1285547..3fd3eab 100644 --- a/src/de/steamwar/bungeecore/sql/Team.java +++ b/src/de/steamwar/bungeecore/sql/Team.java @@ -33,17 +33,15 @@ public class Team { private final int teamId; private String teamKuerzel; private String teamName; - private int teamLeader; private String teamColor; private static final List teamCache = new LinkedList<>(); - private static final Team pub = new Team(0, "PUB", "Öffentlich", 0, "8"); + private static final Team pub = new Team(0, "PUB", "Öffentlich", "8"); - private Team(int id, String kuerzel, String name, int leader, String color){ + private Team(int id, String kuerzel, String name, String color){ teamId = id; teamKuerzel = kuerzel; teamName = name; - teamLeader = leader; teamColor = color; if (id != 0) { teamCache.add(this); @@ -51,7 +49,7 @@ public class Team { } private Team(ResultSet rs) throws SQLException { - this(rs.getInt("TeamID"), rs.getString("TeamKuerzel"), rs.getString("TeamName"), rs.getInt("TeamLeader"), rs.getString("TeamColor")); + this(rs.getInt("TeamID"), rs.getString("TeamKuerzel"), rs.getString("TeamName"), rs.getString("TeamColor")); } public static void create(String kuerzel, String name, int leader){ @@ -60,7 +58,7 @@ public class Team { public static Team get(int id){ if(id == -1) - return new Team(-1, "?", "?", 0, "8"); + return new Team(-1, "?", "?", "8"); if(id == 0) return pub; for(Team team : teamCache) @@ -110,7 +108,7 @@ public class Team { } private void updateDB(){ - SQL.update("INSERT INTO Team (TeamID, TeamKuerzel, TeamName, TeamLeader, TeamColor) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE TeamName = VALUES(TeamName), TeamKuerzel = VALUES(TeamKuerzel), TeamLeader = VALUES(TeamLeader), TeamColor = VALUES(TeamColor)", teamId, teamKuerzel, teamName, teamLeader, teamColor); + SQL.update("INSERT INTO Team (TeamID, TeamKuerzel, TeamName, TeamColor) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE TeamName = VALUES(TeamName), TeamKuerzel = VALUES(TeamKuerzel), TeamColor = VALUES(TeamColor)", teamId, teamKuerzel, teamName, teamColor); } public int getTeamId() { @@ -135,15 +133,6 @@ public class Team { updateDB(); } - public int getTeamLeader() { - return teamLeader; - } - - public void setTeamLeader(int teamLeader) { - this.teamLeader = teamLeader; - updateDB(); - } - public String getTeamColor() { return teamColor; } diff --git a/src/de/steamwar/messages/BungeeCore.properties b/src/de/steamwar/messages/BungeeCore.properties index 5f62c71..f1275fd 100644 --- a/src/de/steamwar/messages/BungeeCore.properties +++ b/src/de/steamwar/messages/BungeeCore.properties @@ -324,7 +324,8 @@ TEAM_HELP_REMOVE=§8/§7team remove §8- §7Entferne jemanden aus deinem Team. TEAM_HELP_KUERZEL=§8/§7team changekuerzel §8- §7Ändere dein Teamkürzel. TEAM_HELP_NAME=§8/§7team changename §8- §7Ändere deinen Teamnamen. TEAM_HELP_COLOR=§8/§7eteam changecolor §8- §7Ändere deine Teamfarbe. -TEAM_HELP_LEADER=§8/§7eteam changeleader §8- §7Ernenne jemanden zum Teamleader. +TEAM_HELP_LEADER=§8/§7eteam promote §8- §7Ernenne jemanden zum Teamleader. +TEAM_HELP_STEP_BACK=§8/§7eteam stepback §8- §7Tritt als Leader zurück. #Team Create TEAM_CREATE_USAGE=§8/§7team create §8[§eTeamkürzel§8] §8[§eTeamname§8] @@ -338,9 +339,12 @@ TEAM_JOIN_NOT_BY_TEAM=§cVon diesem Team wurdest du nicht eingeladen. TEAM_JOIN_JOINED=§7Du bist dem Team §e{0} §7beigetreten! #Team Leave -TEAM_LEAVE_OTHER_LEADER=§cBitte ernenne zunächst ein anderes Teammitglied zum Leader! +TEAM_OTHER_LEADER_REQUIRED=§cBitte ernenne zunächst ein anderes Teammitglied zum Leader! TEAM_LEAVE_LEFT=§7Du hast dein Team verlassen! +#Team Step Back +TEAM_STEP_BACK=§7Du hast deinen Posten als Teamleader abgegeben§8! + #Team Invite TEAM_INVITE_USAGE=§8/§7team invite §8[§eSpieler§8] TEAM_INVITE_NO_PLAYER=§cDiesen Spieler gibt es nicht. @@ -375,7 +379,7 @@ TEAM_NAME_TAKEN=§cEs gibt bereits ein Team mit diesem Namen. TEAM_LEADER_USAGE=§8/§7team changeleader §8[§eMember§8] TEAM_LEADER_NOT_USER=§cDen Spieler {0} gibt es nicht. TEAM_LEADER_NOT_MEMBER=§cDer Spieler ist nicht in deinem Team. -TEAM_LEADER_CHANGED=§7Du hast den Spieler §e{0} §7zum Leader gemacht! +TEAM_LEADER_PROMOTED=§7Du hast den Spieler §e{0} §7zum Leader gemacht! #Team Info TEAM_INFO_USAGE=§8/§7team info §8[§eTeamname§8] @@ -388,7 +392,7 @@ TEAM_INFO_EVENTS=§7Events§8: §e{0} TEAM_LIST_NOT_PAGE=§cKeine Seitenzahl angegeben TEAM_LIST_UNKNOWN_PAGE=§cUngültige Seitenzahl angegeben TEAM_LIST_HEADER=§7§lTeamliste §7{0}§8/§7{1} -TEAM_LIST_TEAM=§{0}{1} §e{2} §8[§7{3}§8] +TEAM_LIST_TEAM=§{0}{1} §e{2} TEAM_LIST_TEAM_HOVER=§7Teaminfo TEAM_LIST_PAGE=Seite TEAM_LIST_NEXT=§eNächste Seite