Skip to content

Commit 98de875

Browse files
committed
The tab list is now organized like everyone wanted.
Added a config system...
1 parent f1038f9 commit 98de875

14 files changed

+305
-30
lines changed

build.gradle

+12
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ archivesBaseName = 'Empire-Minecraft-Utilities-1.16.x'//project.archives_base_na
1010
version = project.mod_version
1111
group = project.maven_group
1212

13+
repositories {
14+
maven {
15+
url "https://maven.shedaniel.me/"
16+
}
17+
}
18+
1319
dependencies {
1420
// To change the versions see the gradle.properties file
1521
minecraft "com.mojang:minecraft:${project.minecraft_version}"
@@ -27,6 +33,12 @@ dependencies {
2733

2834
testImplementation 'org.projectlombok:lombok:1.18.16'
2935
testAnnotationProcessor 'org.projectlombok:lombok:1.18.16'
36+
37+
modApi("me.shedaniel.cloth:cloth-config-fabric:4.10.13") {
38+
exclude(group: "net.fabricmc.fabric-api")
39+
}
40+
41+
modImplementation "io.github.prospector:modmenu:1.14.9+build.14"
3042
}
3143

3244
processResources {

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G
88
loader_version=0.11.1
99

1010
# Mod Properties
11-
mod_version = 1.2.0
11+
mod_version = 1.3.0
1212
maven_group = coffee.waffle
1313
archives_base_name = empire-minecraft-utilities
1414

src/main/java/coffee/waffle/emcutils/EmpireMinecraftUtilities.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,36 @@
11
package coffee.waffle.emcutils;
22

3-
import coffee.waffle.emcutils.callbacks.ChatCallback;
43
import coffee.waffle.emcutils.callbacks.CommandExecutionCallback;
54
import coffee.waffle.emcutils.features.UsableItems;
65
import coffee.waffle.emcutils.features.VisitResidenceHandler;
6+
import coffee.waffle.emcutils.utils.Config;
77
import coffee.waffle.emcutils.utils.Util;
88
import lombok.Getter;
99
import net.fabricmc.api.ModInitializer;
1010
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
11-
import net.minecraft.text.LiteralText;
1211
import net.minecraft.util.ActionResult;
1312
import org.apache.logging.log4j.LogManager;
1413
import org.apache.logging.log4j.Logger;
1514

1615
public class EmpireMinecraftUtilities implements ModInitializer {
1716
@Getter private static EmpireMinecraftUtilities instance;
1817
@Getter private Logger logger;
19-
2018
@Getter private final String MOD_ID = "EMC_UTILS";
19+
@Getter private final String KEYBIND_CATEGORY = "emc_utils.keybinds.category";
2120

2221
@Override
2322
public void onInitialize() {
2423
instance = this;
2524
logger = LogManager.getLogger("EMC Utils");
2625
Util.getOnJoinCommandQueue();
2726

28-
System.out.println("Loaded Empire Minecraft Utilities!");
27+
Config.initConfig();
2928

3029
registerListeners();
3130

3231
UsableItems.onInitialize();
32+
33+
System.out.println("Loaded Empire Minecraft Utilities!");
3334
}
3435

3536
private void registerListeners() {
@@ -45,6 +46,6 @@ private void registerListeners() {
4546
return ActionResult.PASS;
4647
}));
4748

48-
ClientPlayConnectionEvents.INIT.register((Util::handleServerPlayConnect));
49+
ClientPlayConnectionEvents.INIT.register(Util::handleServerPlayConnect);
4950
}
5051
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package coffee.waffle.emcutils.features;
2+
3+
import coffee.waffle.emcutils.utils.Config;
4+
import coffee.waffle.emcutils.utils.EmpireServer;
5+
import coffee.waffle.emcutils.utils.Util;
6+
import com.google.common.collect.Lists;
7+
import lombok.AllArgsConstructor;
8+
import net.minecraft.client.network.PlayerListEntry;
9+
10+
import java.util.List;
11+
import java.util.stream.Collectors;
12+
13+
public class TabListOrganizer {
14+
15+
public static List<PlayerListEntry> sortPlayers(List<PlayerListEntry> original) {
16+
List<EnhancedTabListEntry> enhanced = Lists.newArrayList();
17+
List<EnhancedTabListEntry> currentServer = Lists.newArrayList();
18+
19+
if (!Util.IS_ON_EMC) {
20+
return original;
21+
}
22+
23+
for (PlayerListEntry entry : original) {
24+
char server = entry.getDisplayName().getSiblings().get(0).getString().charAt(1);
25+
String playerName = entry.getDisplayName().getSiblings().get(1).getString();
26+
27+
EnhancedTabListEntry enhancedEntry = new EnhancedTabListEntry(EmpireServer.getByTabListDisplay(server), playerName, entry);
28+
29+
enhanced.add(enhancedEntry);
30+
31+
if (EmpireServer.getByTabListDisplay(server) == Util.getCurrentServer()) {
32+
currentServer.add(enhancedEntry);
33+
}
34+
}
35+
36+
if (!Config.getConfigValues().isTabListShowAllServers()) {
37+
enhanced = enhanced.stream().filter(e -> e.server == Util.getCurrentServer()).collect(Collectors.toList());
38+
}
39+
40+
// This ensures that the names are in alphabetical order before any other sort.
41+
enhanced.sort(Config.TabListSortType.NAME_ASCENDING::compare);
42+
currentServer.sort(Config.TabListSortType.NAME_ASCENDING::compare);
43+
44+
// This sorts based on what config option you have set
45+
enhanced.sort(Config.getConfigValues().getTabListSortType()::compare);
46+
47+
List<EnhancedTabListEntry> sorted = Lists.newArrayList();
48+
49+
switch (Config.getConfigValues().getTabListCurrentServerPlacement()) {
50+
case TOP:
51+
enhanced.removeAll(currentServer);
52+
sorted.addAll(currentServer);
53+
sorted.addAll(enhanced);
54+
break;
55+
case BOTTOM:
56+
enhanced.removeAll(currentServer);
57+
sorted.addAll(enhanced);
58+
sorted.addAll(currentServer);
59+
break;
60+
case MIXED:
61+
sorted.addAll(enhanced);
62+
}
63+
64+
return sorted.stream().map(e -> e.entry).collect(Collectors.toList());
65+
}
66+
67+
@AllArgsConstructor
68+
public static class EnhancedTabListEntry {
69+
public EmpireServer server;
70+
public String playerName;
71+
public PlayerListEntry entry;
72+
}
73+
}

src/main/java/coffee/waffle/emcutils/features/VisitResidenceHandler.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public static ActionResult handleVisitCommand(String[] args) {
3737

3838
EmpireServer server = getResidenceServer(res);
3939

40-
if (server != EmpireServer.NULL_SERVER && server != Util.getCurrentServer()) {
40+
if (server != EmpireServer.NULL && server != Util.getCurrentServer()) {
4141
Util.getOnJoinCommandQueue().add("v " + res + " " + loc);
4242

4343
server.sendToServer();
@@ -71,7 +71,7 @@ public static ActionResult handleHomeCommand(String[] args) {
7171

7272
EmpireServer server = getResidenceServer(resName);
7373

74-
if (server != EmpireServer.NULL_SERVER && server != Util.getCurrentServer()) {
74+
if (server != EmpireServer.NULL && server != Util.getCurrentServer()) {
7575
Util.getOnJoinCommandQueue().add("v " + resName + " " + loc);
7676

7777
server.sendToServer();
@@ -128,7 +128,7 @@ public static EmpireServer getResidenceServer(String name) {
128128
}
129129
}
130130

131-
return EmpireServer.NULL_SERVER;
131+
return EmpireServer.NULL;
132132
}
133133

134134
public static EmpireServer getResidenceServer(int address) {
@@ -138,7 +138,7 @@ public static EmpireServer getResidenceServer(int address) {
138138
}
139139
}
140140

141-
return EmpireServer.NULL_SERVER;
141+
return EmpireServer.NULL;
142142
}
143143

144144
@Data

src/main/java/coffee/waffle/emcutils/mixins/ClientPlayNetworkHandlerMixin.java

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import coffee.waffle.emcutils.callbacks.ChatCallback;
44
import coffee.waffle.emcutils.features.ChatChannels;
5+
import coffee.waffle.emcutils.features.VisitResidenceHandler;
56
import coffee.waffle.emcutils.utils.Util;
67
import net.minecraft.client.MinecraftClient;
78
import net.minecraft.client.network.ClientPlayNetworkHandler;
@@ -47,6 +48,8 @@ public void onPostReceiveMessage(GameMessageS2CPacket packet, CallbackInfo info)
4748
public void onGameJoin(GameJoinS2CPacket packet, CallbackInfo info) {
4849
ChatChannels.processGameJoin(packet, info);
4950

51+
VisitResidenceHandler.loadResidences();
52+
5053
Util.executeJoinCommands();
5154
}
5255
}

src/main/java/coffee/waffle/emcutils/mixins/ConnectScreenMixin.java

+1
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ public class ConnectScreenMixin {
1212
@Inject(at = @At(value = "HEAD"), method = "connect")
1313
public void onConnect(String address, int port, CallbackInfo ci) {
1414
Util.setServerAddress(address);
15+
Util.IS_ON_EMC = address.matches(".*.emc.gs?.");
1516
}
1617
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package coffee.waffle.emcutils.mixins;
2+
3+
import coffee.waffle.emcutils.features.TabListOrganizer;
4+
import net.minecraft.client.gui.hud.PlayerListHud;
5+
import net.minecraft.client.network.PlayerListEntry;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.ModifyVariable;
9+
10+
import java.util.List;
11+
12+
@Mixin(PlayerListHud.class)
13+
public class PlayerListHudMixin {
14+
15+
@ModifyVariable(method = "render", at = @At(value = "INVOKE_ASSIGN", target = "Lcom/google/common/collect/Ordering;sortedCopy(Ljava/lang/Iterable;)Ljava/util/List;"))
16+
public List<PlayerListEntry> customSortTabList(List<PlayerListEntry> original) {
17+
return TabListOrganizer.sortPlayers(original);
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package coffee.waffle.emcutils.utils;
2+
3+
import coffee.waffle.emcutils.features.TabListOrganizer;
4+
import com.google.gson.Gson;
5+
import com.google.gson.GsonBuilder;
6+
import io.github.prospector.modmenu.api.ConfigScreenFactory;
7+
import io.github.prospector.modmenu.api.ModMenuApi;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Getter;
10+
import lombok.Setter;
11+
import me.shedaniel.clothconfig2.api.ConfigBuilder;
12+
import me.shedaniel.clothconfig2.api.ConfigCategory;
13+
import net.fabricmc.api.EnvType;
14+
import net.fabricmc.api.Environment;
15+
import net.minecraft.text.TranslatableText;
16+
17+
import java.io.FileReader;
18+
import java.io.FileWriter;
19+
import java.io.IOException;
20+
21+
@Environment(EnvType.CLIENT)
22+
public class Config implements ModMenuApi {
23+
@Getter private static ConfigValues configValues;
24+
25+
public static void initConfig() {
26+
try (FileReader reader = new FileReader("config/emc_utils.json")) {
27+
Gson gson = new Gson();
28+
29+
configValues = gson.fromJson(reader, ConfigValues.class);
30+
} catch (IOException e) {
31+
Log.exception(e);
32+
}
33+
}
34+
35+
@Getter @Setter
36+
public static class ConfigValues {
37+
public boolean tabListShowAllServers = true;
38+
public TabListSortType tabListSortType = TabListSortType.SERVER_ASCENDING;
39+
public TabListCurrentServerPlacement tabListCurrentServerPlacement = TabListCurrentServerPlacement.TOP;
40+
}
41+
42+
@Override
43+
public ConfigScreenFactory<?> getModConfigScreenFactory() {
44+
return parent -> {
45+
ConfigBuilder builder = ConfigBuilder.create()
46+
.setParentScreen(parent)
47+
.setTitle(new TranslatableText("emc_utils.config"));
48+
49+
ConfigCategory tabList = builder.getOrCreateCategory(new TranslatableText("emc_utils.config.tablist.category"));
50+
51+
tabList.addEntry(builder.entryBuilder()
52+
.startBooleanToggle(new TranslatableText("emc_utils.config.tablist.showAllServers"), configValues.isTabListShowAllServers())
53+
.setDefaultValue(true)
54+
.setSaveConsumer(configValues::setTabListShowAllServers).build());
55+
56+
tabList.addEntry(builder.entryBuilder()
57+
.startEnumSelector(new TranslatableText("emc_utils.config.tablist.sort.type"), TabListSortType.class, configValues.getTabListSortType())
58+
.setDefaultValue(TabListSortType.NAME_ASCENDING)
59+
.setEnumNameProvider(type -> ((TabListSortType) type).getDescription())
60+
.setSaveConsumer(configValues::setTabListSortType).build());
61+
62+
tabList.addEntry(builder.entryBuilder()
63+
.startEnumSelector(new TranslatableText("emc_utils.config.tablist.placement"), TabListCurrentServerPlacement.class, configValues.getTabListCurrentServerPlacement())
64+
.setDefaultValue(TabListCurrentServerPlacement.TOP)
65+
.setEnumNameProvider(placement -> ((TabListCurrentServerPlacement) placement).getDescription())
66+
.setSaveConsumer(configValues::setTabListCurrentServerPlacement).build());
67+
68+
builder.setSavingRunnable(() -> {
69+
try (FileWriter writer = new FileWriter("config/emc_utils.json")) {
70+
Gson gson = new GsonBuilder().setPrettyPrinting().create();
71+
72+
gson.toJson(configValues, writer);
73+
} catch (IOException e) {
74+
Log.exception(e);
75+
}
76+
});
77+
78+
return builder.build();
79+
};
80+
}
81+
82+
@AllArgsConstructor
83+
public enum TabListCurrentServerPlacement {
84+
TOP(new TranslatableText("emc_utils.config.tablist.placement.top")),
85+
BOTTOM(new TranslatableText("emc_utils.config.tablist.placement.bottom")),
86+
MIXED(new TranslatableText("emc_utils.config.tablist.placement.mixed"));
87+
88+
@Getter private TranslatableText description;
89+
}
90+
91+
@AllArgsConstructor
92+
public enum TabListSortType {
93+
NAME_ASCENDING(new TranslatableText("emc_utils.config.tablist.sort.name.ascending")) {
94+
@Override
95+
public int compare(TabListOrganizer.EnhancedTabListEntry entry1, TabListOrganizer.EnhancedTabListEntry entry2) {
96+
return entry1.playerName.toLowerCase().compareTo(entry2.playerName.toLowerCase());
97+
}
98+
},
99+
NAME_DESCENDING(new TranslatableText("emc_utils.config.tablist.sort.name.descending")) {
100+
@Override
101+
public int compare(TabListOrganizer.EnhancedTabListEntry entry1, TabListOrganizer.EnhancedTabListEntry entry2) {
102+
return entry2.playerName.toLowerCase().compareTo(entry1.playerName.toLowerCase());
103+
}
104+
},
105+
SERVER_ASCENDING(new TranslatableText("emc_utils.config.tablist.sort.server.ascending")) {
106+
@Override
107+
public int compare(TabListOrganizer.EnhancedTabListEntry entry1, TabListOrganizer.EnhancedTabListEntry entry2) {
108+
return entry1.server.compareTabListRankTo(entry2.server);
109+
}
110+
},
111+
SERVER_DESCENDING(new TranslatableText("emc_utils.config.tablist.sort.server.descending")) {
112+
@Override
113+
public int compare(TabListOrganizer.EnhancedTabListEntry entry1, TabListOrganizer.EnhancedTabListEntry entry2) {
114+
return entry2.server.compareTabListRankTo(entry1.server);
115+
}
116+
};
117+
118+
@Getter private final TranslatableText description;
119+
120+
public int compare(TabListOrganizer.EnhancedTabListEntry entry1, TabListOrganizer.EnhancedTabListEntry entry2) {
121+
return 0;
122+
}
123+
}
124+
}

0 commit comments

Comments
 (0)