Forge Mod detection #292
@ -21,14 +21,17 @@ package de.steamwar.bungeecore.listeners.mods;
|
||||
import net.md_5.bungee.api.ServerPing;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
|
||||
public class FMLPing extends ServerPing {
|
||||
Lixfel markierte diese Unterhaltung als gelöst
Veraltet
YoyoNow
hat
Also von einem static block war nicht die rede nur den static modifier. Also sowas wie 'private static ForgeData forgeData = new ForgeData();'. Also von einem static block war nicht die rede nur den static modifier. Also sowas wie 'private static ForgeData forgeData = new ForgeData();'.
YoyoNow
hat
Wo wird das überhaupt genutzt? Wo wird das überhaupt genutzt?
Lixfel
hat
GSON-Serializer des ServerListPings. Anmerkung meinerseits: Ob das korrekt serialisiert wird, wenn die ForgeData als static final deklariert wird, muss getestet werden. GSON-Serializer des ServerListPings.
Anmerkung meinerseits: Ob das korrekt serialisiert wird, wenn die ForgeData als static final deklariert wird, muss getestet werden.
YoyoNow
hat
Naja es ist static also gar nicht serializiert? Ansonsten mach halt mit einem instance ansatz, im ForgeData selber. Naja es ist static also gar nicht serializiert? Ansonsten mach halt mit einem instance ansatz, im ForgeData selber.
Lixfel
hat
Ist unbekannt ob, muss daher getestet werden. Ist unbekannt ob, muss daher getestet werden.
Lixfel
hat
Ich glaube, das muss weiterhin forgeData heißen, ansonsten erkennt Forge die Modliste nicht... du solltest auch mal probieren, mit Minecraft-Versionen anders als 1.15.2, ob dann immer noch die Kompatibilität gemeldet wird (da wir ja minecraft 1.15.2 als Mod drin haben... Ich glaube, das muss weiterhin forgeData heißen, ansonsten erkennt Forge die Modliste nicht... du solltest auch mal probieren, mit Minecraft-Versionen anders als 1.15.2, ob dann immer noch die Kompatibilität gemeldet wird (da wir ja minecraft 1.15.2 als Mod drin haben...
zOnlyKroks
hat
static mact hier in diesem Falle nur probleme static mact hier in diesem Falle nur probleme
zOnlyKroks
hat
Kompatibilität wird verneint. Forge 1.16.5 Kompatibilität wird verneint. Forge 1.16.5
|
||||
|
||||
private final ForgeData forgeData = new ForgeData();
|
||||
private final ForgeData forgeData;
|
||||
|
||||
public FMLPing(ServerPing existing) {
|
||||
public FMLPing(ServerPing existing, int version) {
|
||||
super(existing.getVersion(), existing.getPlayers(), existing.getDescriptionComponent(), existing.getFaviconObject());
|
||||
forgeData = new ForgeData(version);
|
||||
}
|
||||
|
||||
YoyoNow
hat
Style? Style?
|
||||
private static class ForgeData {
|
||||
@ -36,14 +39,51 @@ public class FMLPing extends ServerPing {
|
||||
private final List<ForgeMod> mods = new ArrayList<>();
|
||||
private final int fmlNetworkVersion = 2;
|
||||
|
||||
public ForgeData() {
|
||||
public ForgeData(int versionNumber) {
|
||||
channels.add(new ForgeChannel("minecraft:unregister"));
|
||||
channels.add(new ForgeChannel("minecraft:register"));
|
||||
channels.add(new ForgeChannel("fml:handshake"));
|
||||
mods.add(new ForgeMod("minecraft", "1.15.2"));
|
||||
mods.add(new ForgeMod("minecraft", ProtocolVersion.getVersion(versionNumber).toString()));
|
||||
mods.add(new ForgeMod("forge", "ANY"));
|
||||
}
|
||||
|
||||
public enum ProtocolVersion {
|
||||
MINECRAFT_1_18(757),
|
||||
MINECRAFT_1_17_1(756),
|
||||
MINECRAFT_1_16_5(754),
|
||||
MINECRAFT_1_15_2(578),
|
||||
MINECRAFT_1_14_4(498),
|
||||
MINECRAFT_1_13(393),
|
||||
UNKNOWN(0);
|
||||
|
||||
private int number;
|
||||
|
||||
ProtocolVersion(int versionNumber) {
|
||||
this.number = versionNumber;
|
||||
}
|
||||
|
||||
private static Map<Integer, ProtocolVersion> numbers;
|
||||
|
||||
static {
|
||||
numbers = new LinkedHashMap<>();
|
||||
for(ProtocolVersion version : values()) {
|
||||
numbers.put(version.number, version);
|
||||
}
|
||||
}
|
||||
|
||||
public static ProtocolVersion getVersion(int versionNumber) {
|
||||
ProtocolVersion protocolVersion = numbers.get(versionNumber);
|
||||
if (protocolVersion != null) {
|
||||
return protocolVersion;
|
||||
}
|
||||
return UNKNOWN;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return name().replace("MINECRAFT_", "").replace("_", ".");
|
||||
Lixfel
hat
Wäre es nicht einfacher, statt dem Enum einfach direkt eine HashMap<Integer, String> zu machen? Wäre es nicht einfacher, statt dem Enum einfach direkt eine HashMap<Integer, String> zu machen?
|
||||
}
|
||||
}
|
||||
|
||||
private static class ForgeChannel {
|
||||
private final String res;
|
||||
private final String version = "FML2";
|
||||
|
@ -55,7 +55,7 @@ public class Forge extends BasicListener {
|
||||
|
||||
@EventHandler
|
||||
public void onServerPing(ProxyPingEvent event) {
|
||||
event.setResponse(new FMLPing(event.getResponse()));
|
||||
event.setResponse(new FMLPing(event.getResponse(), event.getConnection().getVersion()));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
|
Man könnte noch argumentieren, dass es äußerst schade ist, dass wir hier für jeden Ping die ForeData neu erstellen und danach wieder verwerfen, aber das ist so schon in Ordnung.
Könnte man das nicht einfach mit einem 'static' beheben?
wird morgn als erledigt markiert.