Forge Mod detection #292
@ -1,43 +1,48 @@
|
||||
/*
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
|
||||
This file is a part of the SteamWar software.
|
||||
|
||||
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package de.steamwar.bungeecore.listeners.mods;
|
||||
|
||||
import de.steamwar.bungeecore.BungeeCore;
|
||||
import de.steamwar.bungeecore.sql.Mod;
|
||||
import net.md_5.bungee.BungeeCord;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
import net.md_5.bungee.api.event.LoginEvent;
|
||||
import net.md_5.bungee.api.event.PreLoginEvent;
|
||||
import net.md_5.bungee.api.plugin.Event;
|
||||
import net.md_5.bungee.netty.ChannelWrapper;
|
||||
import net.md_5.bungee.netty.PacketHandler;
|
||||
import net.md_5.bungee.protocol.packet.LoginPayloadResponse;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
public class CustomPacketHandler extends PacketHandler {
|
||||
|
||||
private LoginEvent event;
|
||||
private ChannelWrapper wrapper;
|
||||
private LoginEvent event;
|
||||
|
||||
public CustomPacketHandler(LoginEvent event, ChannelWrapper wrapper) {
|
||||
public CustomPacketHandler(LoginEvent event) {
|
||||
this.event = event;
|
||||
this.wrapper = wrapper;
|
||||
}
|
||||
|
||||
@Override public String toString() {
|
||||
@Override
|
||||
public String toString() {
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Besteht hier wirklich die Notwendigkeit, toString zu überschreiben? Besteht hier wirklich die Notwendigkeit, toString zu überschreiben?
zOnlyKroks
hat
ja, ansonsten meckert intellij rum. ja, ansonsten meckert intellij rum.
|
||||
return null;
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Diese Zeile bitte in der Production-Fassung entfernen. Diese Zeile bitte in der Production-Fassung entfernen.
|
||||
}
|
||||
|
||||
public void handle(LoginPayloadResponse response){
|
||||
if(response.getData() == null) {
|
||||
Lixfel
hat
Noch fehlende Modprüfung :) Noch fehlende Modprüfung :)
|
||||
System.out.println("Data is null with id: " + response.getId() + " , which means Client has no installed mods!");
|
||||
event.completeIntent(BungeeCore.get());
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Ich finde es hier gefährlich, dass du hier den PacketHandler nicht zurück auf den InitialHandler setzt (deshalb hat es wahrscheinlich auch nicht mit dem PreLoginEvent geklappt). Es dürfte aber durch dadurch, dass LoginEvent.completeIntent dazu führt, dass es dann entweder einen Disconnect oder direkt den PlayHandler gibt, egal sein. Daher entweder den Packethandler zurücksetzen oder sich gar nicht hier den Wrapper merken (wozu brauchst du den sonst hier). Ich finde es hier gefährlich, dass du hier den PacketHandler nicht zurück auf den InitialHandler setzt (deshalb hat es wahrscheinlich auch nicht mit dem PreLoginEvent geklappt).
Es dürfte aber durch dadurch, dass LoginEvent.completeIntent dazu führt, dass es dann entweder einen Disconnect oder direkt den PlayHandler gibt, egal sein. Daher entweder den Packethandler zurücksetzen oder sich gar nicht hier den Wrapper merken (wozu brauchst du den sonst hier).
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
byte[] data = response.getData();
|
||||
|
||||
event.completeIntent(BungeeCore.get());
|
||||
}
|
||||
|
@ -1,3 +1,21 @@
|
||||
/*
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Fehlender License-Header Fehlender License-Header
|
||||
This file is a part of the SteamWar software.
|
||||
|
||||
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package de.steamwar.bungeecore.listeners.mods;
|
||||
|
||||
import net.md_5.bungee.api.ServerPing;
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
package de.steamwar.bungeecore.listeners.mods;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import de.steamwar.bungeecore.BungeeCore;
|
||||
import de.steamwar.bungeecore.listeners.BasicListener;
|
||||
import de.steamwar.bungeecore.sql.Mod;
|
||||
@ -41,14 +42,13 @@ import java.lang.reflect.Field;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class Forge extends BasicListener {
|
||||
|
||||
private static final String FMLHS = "FML|HS";
|
||||
private static final String FMLHS13 = "fml:handshake";
|
||||
private static final String WRAPPER = "fml:loginwrapper";
|
||||
private static final byte[] REGISTER;
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Bitte nicht vergessen, den alten 1.13 Forge-Support auszubauen :) (Aber bitte den 1.12- Support drin lassen!) Du kannst dann auch ich glaube im Fabric-Modhandler? den Arenenblock für Forge-Spieler ausbauen. Bitte nicht vergessen, den alten 1.13 Forge-Support auszubauen :) (Aber bitte den 1.12- Support drin lassen!)
Du kannst dann auch ich glaube im Fabric-Modhandler? den Arenenblock für Forge-Spieler ausbauen.
|
||||
private static final byte[] REGISTER13;
|
||||
private static final byte[] HELLO = new byte[]{0, 2, 0, 0, 0, 0};
|
||||
private static final Set<UUID> unlocked = new HashSet<>();
|
||||
|
||||
@ -58,37 +58,28 @@ public class Forge extends BasicListener {
|
||||
buf.writeCharSequence(FMLHS, StandardCharsets.UTF_8);
|
||||
REGISTER = new byte[buf.readableBytes()];
|
||||
buf.readBytes(REGISTER);
|
||||
|
||||
buf.clear();
|
||||
buf.writeByte(13);
|
||||
buf.writeCharSequence(FMLHS13, StandardCharsets.UTF_8);
|
||||
REGISTER13 = new byte[buf.readableBytes()];
|
||||
buf.readBytes(REGISTER13);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onServerConnected(LoginEvent event){
|
||||
//Wir senden Packet ID 1
|
||||
//Wir wollen empfangen Packet ID 2
|
||||
//(FMLHS13, new byte[]{4, 1, 0, 0, 0});
|
||||
//13,102,109,108,58,104,97,110,100,115,104,97,107,101 = 13 + "fml:handshake"
|
||||
if(event.getConnection().getVersion() < 340) return; //1.13+
|
||||
event.getConnection().unsafe().sendPacket(new LoginPayloadRequest(1,WRAPPER, new byte[]{13,102,109,108,58,104,97,110,100,115,104,97,107,101,4,1,0,0,0}));
|
||||
event.registerIntent(BungeeCore.get());
|
||||
|
||||
|
||||
InitialHandler handler = (InitialHandler) event.getConnection();
|
||||
|
||||
Field ch;
|
||||
ChannelWrapper wrapper = null;
|
||||
ChannelWrapper wrapper;
|
||||
|
||||
try{
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Die Kommentarzeile (und ggf. noch die Zeilen drüber) können weg. Die Kommentarzeile (und ggf. noch die Zeilen drüber) können weg.
|
||||
ch = handler.getClass().getDeclaredField("ch");
|
||||
ch.setAccessible(true);
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Hier vorher noch eine Prüfung, dass der Client 1.13 oder höhere Version hat (in dem Fall einfach return). 1.12 und niedriger kennt nämlich keine LoginPayloadRequests. Hier vorher noch eine Prüfung, dass der Client 1.13 oder höhere Version hat (in dem Fall einfach return). 1.12 und niedriger kennt nämlich keine LoginPayloadRequests.
|
||||
wrapper = (ChannelWrapper) ch.get(handler);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
BungeeCore.get().getLogger().log(Level.SEVERE, "Could not get Channel", e);
|
||||
return;
|
||||
}
|
||||
wrapper.getHandle().pipeline().get(HandlerBoss.class).setHandler(new CustomPacketHandler(event, wrapper));
|
||||
event.registerIntent(BungeeCore.get());
|
||||
wrapper.getHandle().pipeline().get(HandlerBoss.class).setHandler(new CustomPacketHandler(event));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
@ -107,10 +98,7 @@ public class Forge extends BasicListener {
|
||||
}
|
||||
}
|
||||
|
||||
if(player.getPendingConnection().getVersion() > 340) {
|
||||
player.sendData("minecraft:register", REGISTER13); //1.13+
|
||||
player.sendData(FMLHS13, Forge.HELLO);
|
||||
}else{
|
||||
if(player.getPendingConnection().getVersion() <= 340) {
|
||||
player.sendData("REGISTER", REGISTER); //1.12-
|
||||
player.sendData(FMLHS, Forge.HELLO);
|
||||
}
|
||||
@ -118,7 +106,7 @@ public class Forge extends BasicListener {
|
||||
|
||||
@EventHandler
|
||||
public void onPluginMessageEvent(PluginMessageEvent e){
|
||||
if(!e.getTag().equals(FMLHS) && !e.getTag().equals(FMLHS13))
|
||||
if(!e.getTag().equals(FMLHS))
|
||||
return;
|
||||
|
||||
e.setCancelled(true);
|
||||
|
@ -56,26 +56,6 @@ public class ModLoaderBlocker extends BasicListener {
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPluginMessage(PluginMessageEvent e){
|
||||
if(!e.getTag().equals("minecraft:register"))
|
||||
return;
|
||||
|
||||
Connection sender = e.getSender();
|
||||
if(!(sender instanceof ProxiedPlayer))
|
||||
return;
|
||||
ProxiedPlayer p = (ProxiedPlayer) sender;
|
||||
|
||||
if(p.getPendingConnection().getVersion() <= 340)
|
||||
return;
|
||||
|
||||
String registered = new String(e.getData(), StandardCharsets.UTF_8);
|
||||
if(registered.contains("fml:loginwrapper") || registered.contains("fml:handshake") || registered.contains("fml:play")){
|
||||
Storage.fabricPlayers.add(p);
|
||||
Message.send("MODLOADER_INSTALLED", p, "Forge");
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onDisconnect(PlayerDisconnectEvent e){
|
||||
Storage.fabricPlayers.remove(e.getPlayer());
|
||||
|
Fehlender License-Header