1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
package gregtech.common.misc.spaceprojects.commands;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.WeakHashMap;
import java.util.stream.Collectors;
import net.minecraft.command.CommandBase;
import net.minecraft.command.ICommandSender;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.EnumChatFormatting;
import org.apache.commons.lang3.tuple.Pair;
import gregtech.api.util.GTUtility;
import gregtech.common.misc.spaceprojects.SpaceProjectManager;
/**
* @author BlueWeabo
*/
public class SPCommand extends CommandBase {
private static final Set<Pair<EntityPlayerMP, EntityPlayerMP>> invite = Collections
.newSetFromMap(new WeakHashMap<>());
private static final Set<EntityPlayerMP> confirm = Collections.newSetFromMap(new WeakHashMap<>());
private static final String INVITE = "invite";
private static final String ACCEPT = "accept";
private static final String LEAVE = "leave";
private static final String CONFIRM = "confirm";
@Override
public String getCommandName() {
return "sp";
}
@Override
public int getRequiredPermissionLevel() {
return 0;
}
@Override
public String getCommandUsage(ICommandSender sender) {
return "/" + getCommandName() + "<subCommand> [PlayerName]";
}
@Override
public void processCommand(ICommandSender sender, String[] arguments) {
if (arguments.length < 1) {
return;
}
switch (arguments[0]) {
case INVITE -> {
if (arguments.length < 2) {
return;
}
processInvite(sender, arguments[1]);
}
case ACCEPT -> {
if (arguments.length < 2) {
return;
}
processAccept(sender, arguments[1]);
}
case LEAVE -> processLeave(sender);
case CONFIRM -> processConfirm(sender);
}
}
private void processInvite(ICommandSender sender, String playerInvited) {
EntityPlayerMP teamLeader = getCommandSenderAsPlayer(sender);
EntityPlayerMP teamMember = getPlayer(sender, playerInvited);
invite.add(Pair.of(teamMember, teamLeader));
String message = EnumChatFormatting.GOLD + teamLeader.getCommandSenderName()
+ EnumChatFormatting.RESET
+ " has sent you an invite to join their team. Accept it with"
+ EnumChatFormatting.GOLD
+ " /sp accept "
+ teamLeader.getCommandSenderName();
GTUtility.sendChatToPlayer(teamMember, message);
}
private void processAccept(ICommandSender sender, String playerInviter) {
EntityPlayerMP teamMember = getCommandSenderAsPlayer(sender);
EntityPlayerMP teamLeader = getPlayer(sender, playerInviter);
if (invite.contains(Pair.of(teamMember, teamLeader))) {
String message = EnumChatFormatting.GOLD + teamMember.getCommandSenderName()
+ EnumChatFormatting.RESET
+ " has accepted the invite.";
SpaceProjectManager.putInTeam(teamMember.getUniqueID(), teamLeader.getUniqueID());
GTUtility.sendChatToPlayer(teamLeader, message);
invite.remove(Pair.of(teamMember, teamLeader));
}
}
private void processLeave(ICommandSender sender) {
EntityPlayerMP player = getCommandSenderAsPlayer(sender);
String message = "Are you sure you want to leave the team. You will lose all progress. Use "
+ EnumChatFormatting.GOLD
+ "/sp confirm"
+ EnumChatFormatting.RESET
+ " to confirm this. This does nothing if you are the team leader.";
GTUtility.sendChatToPlayer(player, message);
confirm.add(player);
}
private void processConfirm(ICommandSender sender) {
EntityPlayerMP player = getCommandSenderAsPlayer(sender);
if (confirm.contains(player)) {
String message = "Successfully left the team.";
SpaceProjectManager.putInTeam(player.getUniqueID(), player.getUniqueID());
GTUtility.sendChatToPlayer(player, message);
confirm.remove(player);
}
}
@Override
public List<String> addTabCompletionOptions(ICommandSender sender, String[] arguments) {
List<String> autoComplete = new ArrayList<>();
String filter = arguments.length == 0 ? "" : arguments[0].trim();
switch (arguments.length) {
case 1 -> autoComplete.addAll(Arrays.asList(getSubCommands()));
case 2 -> {
filter = arguments[1].trim();
if (arguments[0].equals(INVITE)) {
autoComplete.addAll(Arrays.asList(getPlayers()));
break;
}
if (arguments[0].equals(CONFIRM)) {
Optional<Pair<EntityPlayerMP, EntityPlayerMP>> pairOpt = invite.stream()
.filter(
(e) -> e.getKey()
.getUniqueID() == getCommandSenderAsPlayer(sender).getUniqueID())
.findFirst();
if (pairOpt.isPresent()) {
autoComplete.add(
SpaceProjectManager.getPlayerNameFromUUID(
pairOpt.get()
.getRight()
.getUniqueID()));
}
}
}
}
String finalFilter = filter;
return autoComplete.stream()
.filter(s -> finalFilter.isEmpty() || s.startsWith(finalFilter))
.collect(Collectors.toList());
}
private String[] getPlayers() {
return MinecraftServer.getServer()
.getAllUsernames();
}
private String[] getSubCommands() {
return new String[] { INVITE, ACCEPT, LEAVE, CONFIRM };
}
}
|