Skip to content

Commit

Permalink
It compiles
Browse files Browse the repository at this point in the history
  • Loading branch information
bundabrg committed Sep 17, 2020
1 parent e44f025 commit f2e1dab
Show file tree
Hide file tree
Showing 10 changed files with 1,290 additions and 176 deletions.
6 changes: 6 additions & 0 deletions .idea/copyright/MIT.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@
import au.com.grieve.geyser.reversion.config.Configuration;
import au.com.grieve.geyser.reversion.editions.bedrock.BedrockEdition;
import au.com.grieve.geyser.reversion.editions.education.EducationEdition;
import au.com.grieve.geyser.reversion.server.GeyserBedrockServer;
import au.com.grieve.reversion.Build;
import au.com.grieve.reversion.api.RegisteredTranslator;
import au.com.grieve.reversion.api.ReversionServer;
import lombok.Getter;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.event.annotations.GeyserEventHandler;
Expand Down Expand Up @@ -69,7 +69,7 @@ public class GeyserReversionExtension extends GeyserExtension {
private final Map<String, Edition> registeredEditions = new HashMap<>();
private final List<RegisteredTranslator> registeredTranslators = new ArrayList<>();

private ReversionServer server;
private GeyserBedrockServer server;

private Configuration config;

Expand Down Expand Up @@ -148,10 +148,12 @@ public void onGeyserStart(GeyserStartEvent event) {
return;
}

server = new GeyserBedrockServer(GeyserConnector.getInstance().getBedrockServer());

InetSocketAddress address = GeyserConnector.getInstance().getBedrockServer().getBindAddress();

// Create a new server on the same address/port as the default server
server = edition.createReversionServer(GeyserConnector.getInstance().getBedrockServer().getBindAddress());
server.registerServer(edition.createReversionServer(address), true);

try {
Field bedrockServer = GeyserConnector.class.getDeclaredField("bedrockServer");
Expand All @@ -161,7 +163,7 @@ public void onGeyserStart(GeyserStartEvent event) {
// bedrockServer.set(GeyserConnector.getInstance(), server);

} catch (NoSuchFieldException e) {
getLogger().error(String.format("Unable to set Edition '%s'. Extension disabled.", config.getEdition()), e);
getLogger().error(String.format("Unable to enable Edition '%s'. Extension disabled.", config.getEdition()), e);
}

// Give the old BedrockServer time to close down then bind our default server
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,18 @@

import au.com.grieve.geyser.reversion.GeyserReversionExtension;
import au.com.grieve.geyser.reversion.api.Edition;
import au.com.grieve.geyser.reversion.editions.bedrock.handlers.BedrockServerEventHandler;
import au.com.grieve.geyser.reversion.editions.bedrock.handlers.BedrockEditionServerEventHandler;
import au.com.grieve.reversion.Build;
import au.com.grieve.reversion.api.RegisteredTranslator;
import au.com.grieve.reversion.api.ReversionServer;
import au.com.grieve.reversion.editions.bedrock.BedrockRegisteredTranslator;
import au.com.grieve.reversion.editions.bedrock.BedrockReversionServer;
import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockPacketCodec;
import lombok.RequiredArgsConstructor;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.network.BedrockProtocol;

import java.net.InetSocketAddress;
import java.util.Arrays;

@RequiredArgsConstructor
public class BedrockEdition implements Edition {
Expand All @@ -45,8 +47,13 @@ public class BedrockEdition implements Edition {
public ReversionServer createReversionServer(InetSocketAddress address) {
extension.getLogger().info("BedrockServer listening on " + address.toString());

BedrockReversionServer server = new BedrockReversionServer(BedrockProtocol.DEFAULT_BEDROCK_CODEC, address);
server.setHandler(new BedrockServerEventHandler(GeyserConnector.getInstance()));
BedrockPacketCodec defaultCodec = Arrays.stream(Build.PROTOCOLS)
.filter(p -> p.getProtocolVersion() == BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion())
.findFirst()
.orElseThrow(() -> new RuntimeException("Unsupported Geyser"));

BedrockReversionServer server = new BedrockReversionServer(defaultCodec, address);
server.setHandler(new BedrockEditionServerEventHandler(extension));

for (RegisteredTranslator translator : extension.getRegisteredTranslators()) {
if (translator instanceof BedrockRegisteredTranslator) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/*
* MIT License
*
* Copyright (c) 2020 GeyserReversion Developers
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

package au.com.grieve.geyser.reversion.editions.bedrock.handlers;

import au.com.grieve.geyser.reversion.GeyserReversionExtension;
import au.com.grieve.geyser.reversion.server.GeyserServerSession;
import au.com.grieve.reversion.editions.bedrock.BedrockReversionSession;
import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockPong;
import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockServerEventHandler;
import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockServerSession;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.socket.DatagramPacket;
import lombok.Getter;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.network.UpstreamPacketHandler;
import org.geysermc.connector.network.session.GeyserSession;

import javax.annotation.ParametersAreNonnullByDefault;
import java.net.InetSocketAddress;

@Getter
@ParametersAreNonnullByDefault
public class BedrockEditionServerEventHandler implements BedrockServerEventHandler {

private final GeyserReversionExtension extension;

public BedrockEditionServerEventHandler(GeyserReversionExtension extension) {
this.extension = extension;
}


@Override
public boolean onConnectionRequest(InetSocketAddress inetSocketAddress) {
return extension.getServer().getHandler().onConnectionRequest(inetSocketAddress);
}

@Override
public BedrockPong onQuery(InetSocketAddress inetSocketAddress) {
com.nukkitx.protocol.bedrock.BedrockPong originalPong = extension.getServer().getHandler().onQuery(inetSocketAddress);
if (originalPong == null) {
return null;
}

BedrockPong translatedPong = new BedrockPong();
translatedPong.setEdition(originalPong.getEdition());
translatedPong.setExtras(originalPong.getExtras());
translatedPong.setGameType(originalPong.getGameType());
translatedPong.setIpv4Port(originalPong.getIpv4Port());
translatedPong.setIpv6Port(originalPong.getIpv6Port());
translatedPong.setMaximumPlayerCount(originalPong.getMaximumPlayerCount());
translatedPong.setMotd(originalPong.getMotd());
translatedPong.setProtocolVersion(originalPong.getProtocolVersion());
translatedPong.setSubMotd(originalPong.getSubMotd());
translatedPong.setVersion(originalPong.getVersion());
return translatedPong;
}

@Override
public void onSessionCreation(BedrockServerSession bedrockServerSession) {
bedrockServerSession.setLogging(true);
GeyserServerSession facadeSession = new GeyserServerSession((BedrockReversionSession) bedrockServerSession);
GeyserSession geyserSession = new GeyserSession(GeyserConnector.getInstance(), facadeSession);

facadeSession.setPacketHandler(new UpstreamPacketHandler(GeyserConnector.getInstance(), geyserSession));
bedrockServerSession.setPacketHandler(new BedrockEditionUpstreamPacketHandler((BedrockReversionSession) bedrockServerSession,
new GeyserSession(GeyserConnector.getInstance(), facadeSession), facadeSession));
}

@Override
public void onUnhandledDatagram(ChannelHandlerContext ctx, DatagramPacket packet) {
extension.getServer().getHandler().onUnhandledDatagram(ctx, packet);
}
}
Loading

0 comments on commit f2e1dab

Please sign in to comment.