Skip to content

Commit f1038f9

Browse files
committed
Moves you to the correct server on /v command
1 parent 4ab6164 commit f1038f9

13 files changed

+568
-36
lines changed

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.1.1
11+
mod_version = 1.2.0
1212
maven_group = coffee.waffle
1313
archives_base_name = empire-minecraft-utilities
1414

Original file line numberDiff line numberDiff line change
@@ -1,17 +1,50 @@
11
package coffee.waffle.emcutils;
22

3+
import coffee.waffle.emcutils.callbacks.ChatCallback;
4+
import coffee.waffle.emcutils.callbacks.CommandExecutionCallback;
35
import coffee.waffle.emcutils.features.UsableItems;
6+
import coffee.waffle.emcutils.features.VisitResidenceHandler;
47
import coffee.waffle.emcutils.utils.Util;
8+
import lombok.Getter;
59
import net.fabricmc.api.ModInitializer;
6-
import net.fabricmc.fabric.api.client.networking.v1.ClientLoginConnectionEvents;
10+
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
11+
import net.minecraft.text.LiteralText;
12+
import net.minecraft.util.ActionResult;
13+
import org.apache.logging.log4j.LogManager;
14+
import org.apache.logging.log4j.Logger;
715

816
public class EmpireMinecraftUtilities implements ModInitializer {
17+
@Getter private static EmpireMinecraftUtilities instance;
18+
@Getter private Logger logger;
19+
20+
@Getter private final String MOD_ID = "EMC_UTILS";
21+
922
@Override
1023
public void onInitialize() {
24+
instance = this;
25+
logger = LogManager.getLogger("EMC Utils");
26+
Util.getOnJoinCommandQueue();
27+
1128
System.out.println("Loaded Empire Minecraft Utilities!");
1229

13-
ClientLoginConnectionEvents.INIT.register(Util::handleServerLoginSuccess);
30+
registerListeners();
1431

1532
UsableItems.onInitialize();
1633
}
34+
35+
private void registerListeners() {
36+
CommandExecutionCallback.EVENT.register(((command, args) -> {
37+
if (Util.isVisitCommand(command)) {
38+
return VisitResidenceHandler.handleVisitCommand(args);
39+
}
40+
41+
if (Util.isHomeCommand(command)) {
42+
return VisitResidenceHandler.handleHomeCommand(args);
43+
}
44+
45+
return ActionResult.PASS;
46+
}));
47+
48+
ClientPlayConnectionEvents.INIT.register((Util::handleServerPlayConnect));
49+
}
1750
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package coffee.waffle.emcutils.callbacks;
2+
3+
import net.fabricmc.api.EnvType;
4+
import net.fabricmc.api.Environment;
5+
import net.fabricmc.fabric.api.event.Event;
6+
import net.fabricmc.fabric.api.event.EventFactory;
7+
import net.minecraft.client.network.ClientPlayerEntity;
8+
import net.minecraft.util.ActionResult;
9+
10+
public interface ChatCallback {
11+
Event<PreSendMessage> PRE_SEND_MESSAGE = EventFactory.createArrayBacked(PreSendMessage.class,
12+
(listeners) -> (player, message) -> {
13+
for (PreSendMessage listener : listeners) {
14+
ActionResult result = listener.onPreSendMessage(player, message);
15+
16+
if (result != ActionResult.PASS) {
17+
return result;
18+
}
19+
}
20+
21+
return ActionResult.PASS;
22+
});
23+
24+
Event<PostSendMessage> POST_SEND_MESSAGE = EventFactory.createArrayBacked(PostSendMessage.class,
25+
(listeners) -> (player, message) -> {
26+
for (PostSendMessage listener : listeners) {
27+
ActionResult result = listener.onPostSendMessage(player, message);
28+
29+
if (result != ActionResult.PASS) {
30+
return result;
31+
}
32+
}
33+
34+
return ActionResult.PASS;
35+
});
36+
37+
Event<PreReceiveMessage> PRE_RECEIVE_MESSAGE = EventFactory.createArrayBacked(PreReceiveMessage.class,
38+
(listeners) -> (player, message) -> {
39+
for (PreReceiveMessage listener : listeners) {
40+
ActionResult result = listener.onPreReceiveMessage(player, message);
41+
42+
if (result != ActionResult.PASS) {
43+
return result;
44+
}
45+
}
46+
47+
return ActionResult.PASS;
48+
});
49+
50+
Event<PostReceiveMessage> POST_RECEIVE_MESSAGE = EventFactory.createArrayBacked(PostReceiveMessage.class,
51+
(listeners) -> (player, message) -> {
52+
for (PostReceiveMessage listener : listeners) {
53+
ActionResult result = listener.onPostReceiveMessage(player, message);
54+
55+
if (result != ActionResult.PASS) {
56+
return result;
57+
}
58+
}
59+
60+
return ActionResult.PASS;
61+
});
62+
63+
@FunctionalInterface
64+
@Environment(EnvType.CLIENT)
65+
interface PreSendMessage {
66+
ActionResult onPreSendMessage(ClientPlayerEntity player, String message);
67+
}
68+
69+
@FunctionalInterface
70+
@Environment(EnvType.CLIENT)
71+
interface PostSendMessage {
72+
ActionResult onPostSendMessage(ClientPlayerEntity player, String message);
73+
}
74+
75+
@FunctionalInterface
76+
@Environment(EnvType.CLIENT)
77+
interface PreReceiveMessage {
78+
ActionResult onPreReceiveMessage(ClientPlayerEntity player, String message);
79+
}
80+
81+
@FunctionalInterface
82+
@Environment(EnvType.CLIENT)
83+
interface PostReceiveMessage {
84+
ActionResult onPostReceiveMessage(ClientPlayerEntity player, String message);
85+
}
86+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package coffee.waffle.emcutils.callbacks;
2+
3+
import net.fabricmc.fabric.api.event.Event;
4+
import net.fabricmc.fabric.api.event.EventFactory;
5+
import net.minecraft.util.ActionResult;
6+
7+
public interface CommandExecutionCallback {
8+
Event<CommandExecutionCallback> EVENT = EventFactory.createArrayBacked(CommandExecutionCallback.class,
9+
(listeners) -> (command, args) -> {
10+
for (CommandExecutionCallback listener : listeners) {
11+
ActionResult result = listener.interact(command, args);
12+
13+
if (result != ActionResult.PASS) {
14+
return result;
15+
}
16+
}
17+
18+
return ActionResult.PASS;
19+
});
20+
21+
ActionResult interact(String command, String[] args);
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
package coffee.waffle.emcutils.features;
2+
3+
import coffee.waffle.emcutils.utils.EmpireServer;
4+
import coffee.waffle.emcutils.utils.Log;
5+
import coffee.waffle.emcutils.utils.Util;
6+
import com.google.common.collect.Lists;
7+
import com.google.gson.JsonObject;
8+
import com.google.gson.JsonParser;
9+
import lombok.AllArgsConstructor;
10+
import lombok.Data;
11+
import net.minecraft.util.ActionResult;
12+
import org.apache.commons.lang3.math.NumberUtils;
13+
14+
import java.io.IOException;
15+
import java.net.URL;
16+
import java.util.List;
17+
import java.util.Scanner;
18+
import java.util.stream.IntStream;
19+
20+
public class VisitResidenceHandler {
21+
public static List<EmpireResidence> residences = Lists.newArrayList();
22+
23+
public static ActionResult handleVisitCommand(String[] args) {
24+
if (args == null) {
25+
return ActionResult.PASS;
26+
}
27+
28+
String res = args[0];
29+
String loc = args.length > 1 ? args[1] : "";
30+
31+
if (res.contains("@")) {
32+
String[] split = res.split("@");
33+
34+
res = split[0];
35+
loc = (split.length > 1 ? split[1] : "");
36+
}
37+
38+
EmpireServer server = getResidenceServer(res);
39+
40+
if (server != EmpireServer.NULL_SERVER && server != Util.getCurrentServer()) {
41+
Util.getOnJoinCommandQueue().add("v " + res + " " + loc);
42+
43+
server.sendToServer();
44+
45+
return ActionResult.FAIL;
46+
}
47+
48+
return ActionResult.PASS;
49+
}
50+
51+
public static ActionResult handleHomeCommand(String[] args) {
52+
int num = 1;
53+
String loc = "";
54+
55+
if (args != null) {
56+
if (args.length == 1) {
57+
if (NumberUtils.isParsable(args[0])) {
58+
num = Integer.parseInt(args[0]);
59+
} else {
60+
loc = args[0];
61+
}
62+
} else if (args.length == 2) {
63+
if (NumberUtils.isParsable(args[0])) {
64+
num = Integer.parseInt(args[0]);
65+
loc = args[1];
66+
}
67+
}
68+
}
69+
70+
String resName = Util.getPlayer().getEntityName() + (num > 1 ? "-" + num : "");
71+
72+
EmpireServer server = getResidenceServer(resName);
73+
74+
if (server != EmpireServer.NULL_SERVER && server != Util.getCurrentServer()) {
75+
Util.getOnJoinCommandQueue().add("v " + resName + " " + loc);
76+
77+
server.sendToServer();
78+
79+
return ActionResult.FAIL;
80+
}
81+
82+
return ActionResult.PASS;
83+
}
84+
85+
public static void loadResidences() {
86+
residences.clear();
87+
88+
Thread loader = new Thread(() -> {
89+
IntStream.rangeClosed(1, 10).forEach(serverId -> {
90+
try {
91+
URL url = new URL("https://empireminecraft.com/api/server-residence-" + serverId + ".json");
92+
Scanner scanner = new Scanner(url.openStream());
93+
String json = scanner.nextLine();
94+
scanner.close();
95+
96+
JsonObject obj = new JsonParser().parse(json).getAsJsonObject();
97+
98+
obj.entrySet().stream().map(e -> obj.get(e.getKey()).getAsJsonObject()).forEach(resObj -> {
99+
int address = resObj.get("address").getAsInt();
100+
String name = resObj.has("name") ? resObj.get("name").getAsString() : null;
101+
102+
residences.add(new EmpireResidence(address, serverId, name));
103+
});
104+
} catch (IOException e) {
105+
e.printStackTrace();
106+
}
107+
});
108+
109+
Log.info("Loaded " + residences.size() + " residences");
110+
});
111+
112+
loader.setName("loader");
113+
loader.start();
114+
}
115+
116+
public static EmpireServer getResidenceServer(String name) {
117+
for (EmpireResidence residence : residences) {
118+
if (name.contains(".")) {
119+
name = name.split("\\.")[0];
120+
}
121+
122+
if (NumberUtils.isParsable(name)) {
123+
return getResidenceServer(Integer.parseInt(name));
124+
}
125+
126+
if (residence.getName() != null && residence.getName().equalsIgnoreCase(name)) {
127+
return EmpireServer.getById(residence.serverId);
128+
}
129+
}
130+
131+
return EmpireServer.NULL_SERVER;
132+
}
133+
134+
public static EmpireServer getResidenceServer(int address) {
135+
for (EmpireResidence residence : residences) {
136+
if (residence.getAddress() == address) {
137+
return EmpireServer.getById(residence.serverId);
138+
}
139+
}
140+
141+
return EmpireServer.NULL_SERVER;
142+
}
143+
144+
@Data
145+
@AllArgsConstructor
146+
private static class EmpireResidence {
147+
private int address;
148+
private int serverId;
149+
private String name;
150+
}
151+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package coffee.waffle.emcutils.mixins;
2+
3+
import coffee.waffle.emcutils.callbacks.ChatCallback;
4+
import coffee.waffle.emcutils.callbacks.CommandExecutionCallback;
5+
import net.minecraft.client.MinecraftClient;
6+
import net.minecraft.client.network.ClientPlayerEntity;
7+
import net.minecraft.util.ActionResult;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
import org.spongepowered.asm.mixin.injection.Inject;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12+
13+
import java.util.stream.IntStream;
14+
15+
@Mixin(ClientPlayerEntity.class)
16+
public class ClientEntityPlayerMixin {
17+
@Inject(method = "sendChatMessage", at = @At(value = "HEAD"), cancellable = true)
18+
public void sendChatMessage(String message, CallbackInfo info) {
19+
if (message.startsWith("/")) {
20+
message = message.substring(1);
21+
String[] parts = message.split(" ");
22+
ActionResult result = CommandExecutionCallback.EVENT.invoker().interact(parts[0], parts.length > 1 ? IntStream.range(1, parts.length).mapToObj(i -> parts[i]).toArray(String[]::new) : null);
23+
24+
if (result == ActionResult.FAIL) {
25+
info.cancel();
26+
}
27+
}
28+
}
29+
30+
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V"), method = "sendChatMessage", cancellable = true)
31+
public void onPreSendMessage(String message, CallbackInfo info) {
32+
ActionResult result = ChatCallback.PRE_SEND_MESSAGE.invoker().onPreSendMessage(MinecraftClient.getInstance().player, message);
33+
34+
if (result == ActionResult.FAIL) {
35+
info.cancel();
36+
}
37+
}
38+
39+
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V", shift = At.Shift.AFTER), method = "sendChatMessage")
40+
public void onPostSendMessage(String message, CallbackInfo info) {
41+
ChatCallback.POST_SEND_MESSAGE.invoker().onPostSendMessage(MinecraftClient.getInstance().player, message);
42+
}
43+
}

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

-20
This file was deleted.

0 commit comments

Comments
 (0)