Skip to content

Commit

Permalink
Implement Support of Geyser Palette Reordering
Browse files Browse the repository at this point in the history
Squashed commit of the following:

commit 337bd75388d1b1cf58246f1906591519cd4940bd
Author: bundabrg <brendan@grieve.com.au>
Date:   Sun Sep 13 22:40:56 2020 +0800

    Bump to V1.0.10 Reversion

commit bba505b
Author: bundabrg <brendan@grieve.com.au>
Date:   Sun Sep 13 17:34:30 2020 +0800

    Fix Geyser Remapper

commit 4c7bff9
Author: bundabrg <brendan@grieve.com.au>
Date:   Sun Sep 13 11:22:34 2020 +0800

    Working palette Mapper

commit 409406c
Author: bundabrg <brendan@grieve.com.au>
Date:   Fri Sep 11 23:40:33 2020 +0800

    Work

commit ff9c719
Author: bundabrg <brendan@grieve.com.au>
Date:   Wed Sep 9 18:42:32 2020 +0800

    Add Translator to geyser to handle Geyser specific stuff

commit 23d74ab
Author: bundabrg <bundabrg@grieve.com.au>
Date:   Wed Sep 9 17:39:51 2020 +0800

    Start work on geyser palette ordering
  • Loading branch information
bundabrg committed Sep 13, 2020
1 parent 170a9b3 commit 14f0bb3
Show file tree
Hide file tree
Showing 6 changed files with 167 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
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.translators.geyser.v408.Register_Geyser_v408;
import au.com.grieve.reversion.api.RegisteredTranslator;
import au.com.grieve.reversion.api.ReversionServer;
import au.com.grieve.reversion.translators.v390ee_to_v408be.Register_v390ee_to_v408be;
Expand Down Expand Up @@ -93,6 +94,9 @@ private void registerTranslators() {
registerTranslator(Register_v411be_to_v409be.TRANSLATOR);
registerTranslator(Register_v390ee_to_v408be.TRANSLATOR);
registerTranslator(Register_v412be_to_v411be.TRANSLATOR);

// Add Geyser Translators
registerTranslator(Register_Geyser_v408.TRANSLATOR);
}


Expand Down Expand Up @@ -151,10 +155,6 @@ public void onGeyserStart(GeyserStartEvent event) {
bedrockServer.setAccessible(true);

ReversionServer server = edition.createReversionServer(GeyserConnector.getInstance().getBedrockServer().getBindAddress());
for (RegisteredTranslator translator : getRegisteredTranslators()) {
server.registerTranslator(translator);
getLogger().debug("Registered Translator: " + translator.getName());
}

GeyserConnector.getInstance().getBedrockServer().close();
bedrockServer.set(GeyserConnector.getInstance(), server);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,36 @@

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

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.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 lombok.RequiredArgsConstructor;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.extension.GeyserExtension;
import org.geysermc.connector.network.BedrockProtocol;

import java.net.InetSocketAddress;

@RequiredArgsConstructor
public class BedrockEdition implements Edition {
private final GeyserExtension extension;
private final GeyserReversionExtension extension;

@Override
public ReversionServer createReversionServer(InetSocketAddress address) {
extension.getLogger().info("BedrockServer listening on " + address.toString());
ReversionServer server = new BedrockReversionServer("bedrock", BedrockProtocol.DEFAULT_BEDROCK_CODEC, address);
BedrockReversionServer server = new BedrockReversionServer("geyser-bedrock", BedrockProtocol.DEFAULT_BEDROCK_CODEC, address);
server.setHandler(new BedrockServerEventHandler(GeyserConnector.getInstance()));

for (RegisteredTranslator translator : extension.getRegisteredTranslators()) {
if (translator instanceof BedrockRegisteredTranslator) {
server.registerTranslator((BedrockRegisteredTranslator) translator);
}
extension.getLogger().debug("Registered Translator: " + translator.getName());
}

return server;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,28 +18,30 @@

package au.com.grieve.geyser.reversion.editions.education;

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.education.commands.EducationCommand;
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.education.EducationReversionServer;
import au.com.grieve.reversion.editions.education.utils.TokenManager;
import lombok.Getter;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.event.annotations.GeyserEventHandler;
import org.geysermc.connector.event.events.geyser.GeyserStartEvent;
import org.geysermc.connector.extension.GeyserExtension;
import org.geysermc.connector.network.BedrockProtocol;

import java.io.File;
import java.net.InetSocketAddress;

@Getter
public class EducationEdition implements Edition {
private final GeyserExtension extension;
private final GeyserReversionExtension extension;
private final TokenManager tokenManager;

public EducationEdition(GeyserExtension extension) {
public EducationEdition(GeyserReversionExtension extension) {
this.extension = extension;

this.tokenManager = new TokenManager(new File(extension.getDataFolder(), "tokens.yml"));
Expand All @@ -58,8 +60,16 @@ public void onGeyserStart(GeyserStartEvent event) {
@Override
public ReversionServer createReversionServer(InetSocketAddress address) {
extension.getLogger().info("EducationServer listening on " + address.toString());
ReversionServer server = new EducationReversionServer("bedrock", BedrockProtocol.DEFAULT_BEDROCK_CODEC, tokenManager, address);
EducationReversionServer server = new EducationReversionServer("geyser-bedrock", BedrockProtocol.DEFAULT_BEDROCK_CODEC, tokenManager, address);
server.setHandler(new BedrockServerEventHandler(GeyserConnector.getInstance()));

for (RegisteredTranslator translator : extension.getRegisteredTranslators()) {
if (translator instanceof BedrockRegisteredTranslator) {
server.registerTranslator((BedrockRegisteredTranslator) translator);
}
extension.getLogger().debug("Registered Translator: " + translator.getName());
}

return server;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* EduSupport - Minecraft Protocol Support for MultiVersion in Geyser
* Copyright (C) 2020 GeyserReversion Developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

package au.com.grieve.geyser.reversion.translators.geyser.v408;

import au.com.grieve.geyser.reversion.translators.geyser.v408.handlers.StartGameHandler_Geyser_v408;
import au.com.grieve.reversion.editions.bedrock.BedrockRegisteredTranslator;
import au.com.grieve.reversion.editions.bedrock.BedrockTranslator;
import au.com.grieve.reversion.editions.bedrock.handlers.LevelChunkHandler_Bedrock;
import au.com.grieve.reversion.editions.bedrock.handlers.UpdateBlockHandler_Bedrock;
import au.com.grieve.reversion.editions.bedrock.mappers.BlockMapper;
import au.com.grieve.reversion.editions.bedrock.mappers.EntityMapper;
import au.com.grieve.reversion.editions.bedrock.mappers.ItemMapper;
import com.nukkitx.protocol.bedrock.packet.LevelChunkPacket;
import com.nukkitx.protocol.bedrock.packet.StartGamePacket;
import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket;
import com.nukkitx.protocol.bedrock.v408.Bedrock_v408;

public class Register_Geyser_v408 {
public static BedrockRegisteredTranslator TRANSLATOR = BedrockRegisteredTranslator.builder()
.fromEdition("bedrock")
.fromProtocolVersion(408)
.toEdition("geyser-bedrock")
.toProtocolVersion(408)
.codec(Bedrock_v408.V408_CODEC)
.translator(BedrockTranslator.class)
.blockMapper(BlockMapper.builder()
.palette(() -> Register_Geyser_v408.class.getResourceAsStream("/protocol/bedrock-v408/blockpalette.nbt"))
.build()
)
.itemMapper(ItemMapper.DEFAULT)
.entityMapper(EntityMapper.DEFAULT)
.registerPacketHandler(LevelChunkPacket.class, LevelChunkHandler_Bedrock.class)
.registerPacketHandler(StartGamePacket.class, StartGameHandler_Geyser_v408.class)
.registerPacketHandler(UpdateBlockPacket.class, UpdateBlockHandler_Bedrock.class)
.build();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
* EduSupport - Minecraft Protocol Support for MultiVersion in Geyser
* Copyright (C) 2020 GeyserReversion Developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

package au.com.grieve.geyser.reversion.translators.geyser.v408.handlers;

import au.com.grieve.geyser.reversion.GeyserReversionExtension;
import au.com.grieve.reversion.editions.bedrock.BedrockTranslator;
import au.com.grieve.reversion.editions.bedrock.handlers.StartGameHandler_Bedrock;
import com.nukkitx.nbt.NbtList;
import com.nukkitx.nbt.NbtMap;
import com.nukkitx.protocol.bedrock.packet.StartGamePacket;

import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/*
Geyser re-arranged the block palette which will cause issues with the new baked in palette format.
What we do here is to re-arrange it back based upon the supported bedrock palette in Geyser and keep a record
of the mapping so we translate it in other packets
*/
public class StartGameHandler_Geyser_v408 extends StartGameHandler_Bedrock {
protected boolean initialized = false;

public StartGameHandler_Geyser_v408(BedrockTranslator translator) {
super(translator);
}

@Override
public boolean fromDownstream(StartGamePacket packet) {
// Only grab runtime ID's for the first player
if (!initialized) {
initialized = true;

NbtList<NbtMap> geyserTags = packet.getBlockPalette();

Map<Integer, NbtMap> translatedTags = IntStream.range(0, getTranslator().getRegisteredTranslator().getBlockMapper().getUpstreamPalette().size())
.boxed()
.collect(Collectors.toMap(i -> i, i -> getTranslator().getRegisteredTranslator().getBlockMapper().getUpstreamPalette().get(i).getCompound("block")));

for (int geyserId = 0; geyserId < geyserTags.size(); geyserId++) {
NbtMap geyserTag = geyserTags.get(geyserId).getCompound("block");
boolean found = false;
for (Map.Entry<Integer, NbtMap> entry : translatedTags.entrySet()) {
if (geyserTag.equals(entry.getValue())) {
getTranslator().getRegisteredTranslator().getBlockMapper().registerRuntimeIdMapping(geyserId, entry.getKey());
found = true;
translatedTags.remove(entry.getKey());
break;
}
}
if (!found) {
GeyserReversionExtension.getInstance().getLogger().error("Unable to find upstream palette entry: " + geyserTag);
getTranslator().getRegisteredTranslator().getBlockMapper().registerRuntimeIdMapping(geyserId, 0); // Set to 0 for now
}
if (translatedTags.size() == 0) {
break;
}
}

if (translatedTags.size() > 0) {
GeyserReversionExtension.getInstance().getLogger().error("Extra upstream unmatched palette entries: \n" + translatedTags);
}
}

return super.fromDownstream(packet);
}
}
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<reversion.version>1.0.9</reversion.version>
<reversion.version>1.0.10</reversion.version>
</properties>

<build>
Expand Down

0 comments on commit 14f0bb3

Please sign in to comment.