package server.squad;
import client.MapleCharacter;
import handling.channel.ChannelServer;
import handling.world.WorldFindService;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;
import server.MapleCarnivalChallenge;
import server.Timer.EtcTimer;
import server.maps.MapleMap;
import tools.MaplePacketCreator;
import tools.Pair;
public class MapleSquad {
private WeakReference<MapleCharacter> leader;
private final String leaderName;
private final String toSay;
private final Map<String, String> members = new LinkedHashMap();
private final Map<String, String> bannedMembers = new LinkedHashMap();
private final int ch;
private final long startTime;
private final int expiration;
private final int beginMapId;
private final MapleSquadType type;
private byte status = 0;
private ScheduledFuture<?> removal;
public MapleSquad(int ch, String type, MapleCharacter leader, int expiration, String toSay) {
this.leader = new WeakReference(leader);
this.members.put(leader.getName(), MapleCarnivalChallenge.getJobBasicNameById(leader.getJob()));
this.leaderName = leader.getName();
this.ch = ch;
this.toSay = toSay;
this.type = MapleSquadType.valueOf(type.toLowerCase());
this.status = 1;
this.beginMapId = leader.getMapId();
leader.getMap().setSquad(this.type);
if (this.type.queue.get(ch) == null) {
this.type.queue.put(ch, new ArrayList());
this.type.queuedPlayers.put(ch, new ArrayList());
}
this.startTime = System.currentTimeMillis();
this.expiration = expiration;
}
public void copy() {
while ((((ArrayList) this.type.queue.get(this.ch)).size() > 0) && (ChannelServer.getInstance(this.ch).getMapleSquad(this.type) == null)) {
int index = 0;
long lowest = 0L;
for (int i = 0; i < ((ArrayList) this.type.queue.get(this.ch)).size(); i++) {
if ((lowest == 0L) || (((Long) ((Pair) ((ArrayList) this.type.queue.get(this.ch)).get(i)).right) < lowest)) {
index = i;
lowest = ((Long) ((Pair) ((ArrayList) this.type.queue.get(this.ch)).get(i)).right);
}
}
String nextPlayerId = (String) ((Pair) ((ArrayList) this.type.queue.get(Integer.valueOf(this.ch))).remove(index)).left;
int theirCh = WorldFindService.getInstance().findChannel(nextPlayerId);
if (theirCh > 0) {
MapleCharacter lead = ChannelServer.getInstance(theirCh).getPlayerStorage().getCharacterByName(nextPlayerId);
if ((lead != null) && (lead.getMapId() == this.beginMapId) && (lead.getClient().getChannel() == this.ch)) {
MapleSquad squad = new MapleSquad(this.ch, this.type.name(), lead, this.expiration, this.toSay);
if (ChannelServer.getInstance(this.ch).addMapleSquad(squad, this.type.name())) {
getBeginMap().broadcastMessage(MaplePacketCreator.getClock(this.expiration / 1000));
getBeginMap().broadcastMessage(MaplePacketCreator.serverMessageNotice(new StringBuilder().append(nextPlayerId).append(this.toSay).toString()));
((ArrayList) this.type.queuedPlayers.get(this.ch)).add(new Pair(nextPlayerId, "Success"));
break;
}
squad.clear();
((ArrayList) this.type.queuedPlayers.get(this.ch)).add(new Pair(nextPlayerId, "Skipped"));
break;
}
if (lead != null) {
lead.dropMessage(6, "Your squad has been skipped due to you not being in the right channel and map.");
}
getBeginMap().broadcastMessage(MaplePacketCreator.serverMessageNotice(new StringBuilder().append(nextPlayerId).append("'s squad has been skipped due to the player not being in the right channel and map.").toString()));
((ArrayList) this.type.queuedPlayers.get(this.ch)).add(new Pair(nextPlayerId, "Not in map"));
} else {
getBeginMap().broadcastMessage(MaplePacketCreator.serverMessageNotice(new StringBuilder().append(nextPlayerId).append("'s squad has been skipped due to the player not being online.").toString()));
((ArrayList) this.type.queuedPlayers.get(this.ch)).add(new Pair(nextPlayerId, "Not online"));
}
}
}
public MapleMap getBeginMap() {
return ChannelServer.getInstance(this.ch).getMapFactory().getMap(this.beginMapId);
}
public void clear() {
if (this.removal != null) {
getBeginMap().broadcastMessage(MaplePacketCreator.stopClock());
this.removal.cancel(false);
this.removal = null;
}
this.members.clear();
this.bannedMembers.clear();
this.leader = null;
ChannelServer.getInstance(this.ch).removeMapleSquad(this.type);
this.status = 0;
}
public MapleCharacter getChar(String name) {
return ChannelServer.getInstance(this.ch).getPlayerStorage().getCharacterByName(name);
}
public long getTimeLeft() {
return this.expiration - (System.currentTimeMillis() - this.startTime);
}
public void scheduleRemoval() {
this.removal = EtcTimer.getInstance().schedule(new Runnable() {
@Override
public void run() {
if ((MapleSquad.this.status != 0) && (MapleSquad.this.leader != null) && ((MapleSquad.this.getLeader() == null) || (MapleSquad.this.status == 1))) {
MapleSquad.this.clear();
MapleSquad.this.copy();
}
}
}, this.expiration);
}
public String getLeaderName() {
return this.leaderName;
}
public List<Pair<String, Long>> getAllNextPlayer() {
return (List) this.type.queue.get(this.ch);
}
public boolean containsNextPlayer(MapleCharacter player) {
for (Pair names : type.queue.get(this.ch)) {
if (((String) names.left).equalsIgnoreCase(player.getName())) {
return true;
}
}
return false;
}
public String getNextPlayer() {
StringBuilder sb = new StringBuilder("\n远征人数 : ");
sb.append("#b").append(((ArrayList) this.type.queue.get(this.ch)).size()).append(" #k ").append("远征队成员信息 : \n\r ");
int i = 0;
for (Pair chr : type.queue.get(this.ch)) {
i++;
sb.append(i).append(" : ").append((String) chr.left);
sb.append(" \n\r ");
}
sb.append("Would you like to #ebe next#n in the queue, or #ebe removed#n from the queue if you are in it?");
return sb.toString();
}
public void setNextPlayer(String chr) {
Pair toRemove = null;
for (Pair s : type.queue.get(this.ch)) {
if (((String) s.left).equals(chr)) {
toRemove = s;
break;
}
}
if (toRemove != null) {
((ArrayList) this.type.queue.get(this.ch)).remove(toRemove);
return;
}
for (ArrayList<Pair<String, Long>> v : this.type.queue.values()) {
for (Pair s : v) {
if (((String) s.left).equals(chr)) {
return;
}
}
}
((ArrayList) this.type.queue.get(this.ch)).add(new Pair(chr, System.currentTimeMillis()));
}
public MapleCharacter getLeader() {
if ((this.leader == null) || (this.leader.get() == null)) {
if ((this.members.size() > 0) && (getChar(this.leaderName) != null)) {
this.leader = new WeakReference(getChar(this.leaderName));
} else {
if (this.status != 0) {
clear();
}
return null;
}
}
return (MapleCharacter) this.leader.get();
}
public boolean containsMember(MapleCharacter member) {
for (String mmbr : this.members.keySet()) {
if (mmbr.equalsIgnoreCase(member.getName())) {
return true;
}
}
return false;
}
public List<String> getMembers() {
return new LinkedList(this.members.keySet());
}
public List<String> getBannedMembers() {
return new LinkedList(this.bannedMembers.keySet());
}
public int getSquadSize() {
return this.members.size();
}
public boolean isBanned(MapleCharacter member) {
return this.bannedMembers.containsKey(member.getName());
}
public int addMember(MapleCharacter member, boolean join) {
if (getLeader() == null) {
return -1;
}
String job = MapleCarnivalChallenge.getJobBasicNameById(member.getJob());
if (join) {
if ((!containsMember(member)) && (!containsNextPlayer(member))) {
if (this.members.size() <= 30) {
this.members.put(member.getName(), job);
getLeader().dropMessage(5, new StringBuilder().append(member.getName()).append(" (").append(job).append(") 加入了远征队.").toString());
return 1;
}
return 2;
}
return -1;
}
if (containsMember(member)) {
this.members.remove(member.getName());
getLeader().dropMessage(5, new StringBuilder().append(member.getName()).append(" (").append(job).append(") 离开了远征队.").toString());
return 1;
}
return -1;
}
public void acceptMember(int pos) {
if ((pos < 0) || (pos >= this.bannedMembers.size())) {
return;
}
List membersAsList = getBannedMembers();
String toadd = (String) membersAsList.get(pos);
if ((toadd != null) && (getChar(toadd) != null)) {
this.members.put(toadd, this.bannedMembers.get(toadd));
this.bannedMembers.remove(toadd);
getChar(toadd).dropMessage(5, new StringBuilder().append(getLeaderName()).append(" 将你列为远征队队员.").toString());
}
}
public void reAddMember(MapleCharacter chr) {
removeMember(chr);
this.members.put(chr.getName(), MapleCarnivalChallenge.getJobBasicNameById(chr.getJob()));
}
public void removeMember(MapleCharacter chr) {
if (this.members.containsKey(chr.getName())) {
this.members.remove(chr.getName());
}
}
public void removeMember(String chr) {
if (this.members.containsKey(chr)) {
this.members.remove(chr);
}
}
public void banMember(int pos) {
if ((pos <= 0) || (pos >= this.members.size())) {
return;
}
List membersAsList = getMembers();
String toban = (String) membersAsList.get(pos);
if ((toban != null) && (getChar(toban) != null)) {
this.bannedMembers.put(toban, this.members.get(toban));
this.members.remove(toban);
getChar(toban).dropMessage(5, new StringBuilder().append(getLeaderName()).append(" 将你请出远征队,目前无法加入远征队.").toString());
}
}
public void setStatus(byte status) {
this.status = status;
if ((status == 2) && (this.removal != null)) {
this.removal.cancel(false);
this.removal = null;
}
}
public int getStatus() {
return this.status;
}
public int getBannedMemberSize() {
return this.bannedMembers.size();
}
public String getSquadMemberString(byte type) {
switch (type) {
case 0:
StringBuilder sb = new StringBuilder("总共 : ");
sb.append("#b").append(this.members.size()).append(" #k ").append("个远征队成员 : \n\r ");
int i = 0;
for (Map.Entry chr : this.members.entrySet()) {
i++;
sb.append(i).append(" : ").append((String) chr.getKey()).append(" (").append((String) chr.getValue()).append(") ");
if (i == 1) {
sb.append("(远征队队长)");
}
sb.append(" \n\r ");
}
while (i < 30) {
i++;
sb.append(i).append(" : ").append(" \n\r ");
}
return sb.toString();
case 1:
sb = new StringBuilder("总共 : ");
sb.append("#b").append(this.members.size()).append(" #k ").append("个远征队成员 : \n\r ");
i = 0;
int selection = 0;
for (Map.Entry chr : this.members.entrySet()) {
i++;
sb.append("#b#L").append(selection).append("#");
selection++;
sb.append(i).append(" : ").append((String) chr.getKey()).append(" (").append((String) chr.getValue()).append(") ");
if (i == 1) {
sb.append("(远征队队长)");
}
sb.append("#l").append(" \n\r ");
}
while (i < 30) {
i++;
sb.append(i).append(" : ").append(" \n\r ");
}
return sb.toString();
case 2:
sb = new StringBuilder("总共 : ");
selection = 0;
sb.append("#b").append(this.members.size()).append(" #k ").append("个远征队成员 : \n\r ");
i = 0;
for (Map.Entry chr : this.bannedMembers.entrySet()) {
i++;
sb.append("#b#L").append(selection).append("#");
selection++;
sb.append(i).append(" : ").append((String) chr.getKey()).append(" (").append((String) chr.getValue()).append(") ");
sb.append("#l").append(" \n\r ");
}
while (i < 30) {
i++;
sb.append(i).append(" : ").append(" \n\r ");
}
return sb.toString();
case 3:
sb = new StringBuilder("总共 : ");
Map<String, Integer> jobs = getJobs();
for (Map.Entry chr : jobs.entrySet()) {
sb.append("\r\n").append((String) chr.getKey()).append(" : ").append(chr.getValue());
}
return sb.toString();
}
return null;
}
public MapleSquadType getType() {
return this.type;
}
public Map<String, Integer> getJobs() {
Map jobs = new LinkedHashMap();
for (Map.Entry chr : this.members.entrySet()) {
if (jobs.containsKey(chr.getValue())) {
jobs.put(chr.getValue(), ((Integer) jobs.get(chr.getValue())) + 1);
} else {
jobs.put(chr.getValue(), 1);
}
}
return jobs;
}
}