forked from GeyserMC/Geyser
Merge branch 'master' of https://github.com/GeyserMC/Geyser
This commit is contained in:
commit
f7f424db9a
39 changed files with 4627 additions and 235 deletions
3
Jenkinsfile
vendored
3
Jenkinsfile
vendored
|
@ -44,6 +44,9 @@ pipeline {
|
||||||
post {
|
post {
|
||||||
always {
|
always {
|
||||||
deleteDir()
|
deleteDir()
|
||||||
|
withCredentials([string(credentialsId: 'geyser-discord-webhook', variable: 'DISCORD_WEBHOOK')]) {
|
||||||
|
discordSend description: "**Build:** [${currentBuild.id}](${env.BUILD_URL})\n**Status:** [${currentBuild.currentResult}](${env.BUILD_URL})\n\n[**Artifacts on Jenkins**](https://ci.nukkitx.com/job/Geyser)", footer: 'NukkitX Jenkins', link: env.BUILD_URL, successful: currentBuild.resultIsBetterOrEqualTo('SUCCESS'), title: "${env.JOB_NAME} #${currentBuild.id}", webhookURL: DISCORD_WEBHOOK
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,4 +1,9 @@
|
||||||
# Geyser
|
# Geyser
|
||||||
|
|
||||||
|
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
|
||||||
|
[![Build Status](https://ci.nukkitx.com/job/Geyser/job/master/badge/icon)](https://ci.nukkitx.com/job/Geyser/job/master/)
|
||||||
|
[![Discord](https://img.shields.io/discord/597838753859633172.svg?color=%237289da&label=discord)](https://discord.gg/mRjbCsS)
|
||||||
|
|
||||||
A bridge between Minecraft: Bedrock Edition and Minecraft: Java Edition, closing the gap from those wanting to play together.
|
A bridge between Minecraft: Bedrock Edition and Minecraft: Java Edition, closing the gap from those wanting to play together.
|
||||||
|
|
||||||
## What is Geyser?
|
## What is Geyser?
|
||||||
|
|
|
@ -29,6 +29,8 @@ import org.geysermc.api.command.CommandMap;
|
||||||
import org.geysermc.api.logger.Logger;
|
import org.geysermc.api.logger.Logger;
|
||||||
import org.geysermc.api.plugin.PluginManager;
|
import org.geysermc.api.plugin.PluginManager;
|
||||||
|
|
||||||
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
|
||||||
public interface Connector {
|
public interface Connector {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -52,6 +54,13 @@ public interface Connector {
|
||||||
*/
|
*/
|
||||||
PluginManager getPluginManager();
|
PluginManager getPluginManager();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the general thread pool
|
||||||
|
*
|
||||||
|
* @return the general thread pool
|
||||||
|
*/
|
||||||
|
ScheduledExecutorService getGeneralThreadPool();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shuts down the connector
|
* Shuts down the connector
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -29,6 +29,8 @@ import org.geysermc.api.command.CommandMap;
|
||||||
import org.geysermc.api.logger.Logger;
|
import org.geysermc.api.logger.Logger;
|
||||||
import org.geysermc.api.plugin.PluginManager;
|
import org.geysermc.api.plugin.PluginManager;
|
||||||
|
|
||||||
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
|
||||||
public class Geyser {
|
public class Geyser {
|
||||||
|
|
||||||
private static Connector connector;
|
private static Connector connector;
|
||||||
|
@ -77,4 +79,8 @@ public class Geyser {
|
||||||
public static CommandMap getCommandMap() {
|
public static CommandMap getCommandMap() {
|
||||||
return connector.getCommandMap();
|
return connector.getCommandMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ScheduledExecutorService getGeneralThreadPool() {
|
||||||
|
return connector.getGeneralThreadPool();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.inventory;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.window.WindowType;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
public class Inventory {
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private boolean open;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private WindowType windowType;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private int size;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private ItemStack[] items;
|
||||||
|
|
||||||
|
public Inventory(int id, WindowType windowType, int size) {
|
||||||
|
this.id = id;
|
||||||
|
this.windowType = windowType;
|
||||||
|
this.size = size;
|
||||||
|
|
||||||
|
this.title = "Inventory";
|
||||||
|
this.items = new ItemStack[size];
|
||||||
|
}
|
||||||
|
}
|
|
@ -103,6 +103,6 @@ public class ConnectorServerEventHandler implements BedrockServerEventHandler {
|
||||||
bedrockServerSession.setLogging(true);
|
bedrockServerSession.setLogging(true);
|
||||||
bedrockServerSession.setPacketHandler(new UpstreamPacketHandler(connector, new GeyserSession(connector, bedrockServerSession)));
|
bedrockServerSession.setPacketHandler(new UpstreamPacketHandler(connector, new GeyserSession(connector, bedrockServerSession)));
|
||||||
bedrockServerSession.addDisconnectHandler((x) -> GeyserLogger.DEFAULT.warning("Bedrock user with ip: " + bedrockServerSession.getAddress().getAddress() + " has disconnected for reason " + x));
|
bedrockServerSession.addDisconnectHandler((x) -> GeyserLogger.DEFAULT.warning("Bedrock user with ip: " + bedrockServerSession.getAddress().getAddress() + " has disconnected for reason " + x));
|
||||||
bedrockServerSession.setPacketCodec(Bedrock_v361.V361_CODEC);
|
bedrockServerSession.setPacketCodec(GeyserConnector.BEDROCK_PACKET_CODEC);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -25,15 +25,13 @@
|
||||||
|
|
||||||
package org.geysermc.connector.network;
|
package org.geysermc.connector.network;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.client.ClientChatPacket;
|
import com.fasterxml.jackson.databind.node.JsonNodeType;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerSwingArmPacket;
|
|
||||||
import com.nimbusds.jose.JWSObject;
|
import com.nimbusds.jose.JWSObject;
|
||||||
import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler;
|
import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler;
|
||||||
import com.nukkitx.protocol.bedrock.packet.*;
|
import com.nukkitx.protocol.bedrock.packet.*;
|
||||||
import net.minidev.json.JSONArray;
|
import com.nukkitx.protocol.bedrock.util.EncryptionUtils;
|
||||||
import net.minidev.json.JSONObject;
|
import net.minidev.json.JSONObject;
|
||||||
import net.minidev.json.JSONValue;
|
|
||||||
import org.geysermc.api.events.player.PlayerFormResponseEvent;
|
import org.geysermc.api.events.player.PlayerFormResponseEvent;
|
||||||
import org.geysermc.api.window.CustomFormBuilder;
|
import org.geysermc.api.window.CustomFormBuilder;
|
||||||
import org.geysermc.api.window.CustomFormWindow;
|
import org.geysermc.api.window.CustomFormWindow;
|
||||||
|
@ -45,7 +43,16 @@ import org.geysermc.connector.GeyserConnector;
|
||||||
import org.geysermc.connector.network.session.GeyserSession;
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
import org.geysermc.connector.network.session.auth.BedrockAuthData;
|
import org.geysermc.connector.network.session.auth.BedrockAuthData;
|
||||||
import org.geysermc.connector.network.session.cache.WindowCache;
|
import org.geysermc.connector.network.session.cache.WindowCache;
|
||||||
|
import org.geysermc.connector.network.translators.Registry;
|
||||||
|
import org.geysermc.connector.utils.LoginEncryptionUtils;
|
||||||
|
|
||||||
|
import javax.crypto.SecretKey;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.security.KeyPair;
|
||||||
|
import java.security.KeyPairGenerator;
|
||||||
|
import java.security.PublicKey;
|
||||||
|
import java.security.interfaces.ECPublicKey;
|
||||||
|
import java.security.spec.ECGenParameterSpec;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class UpstreamPacketHandler implements BedrockPacketHandler {
|
public class UpstreamPacketHandler implements BedrockPacketHandler {
|
||||||
|
@ -67,22 +74,48 @@ public class UpstreamPacketHandler implements BedrockPacketHandler {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
session.getUpstream().setPacketCodec(GeyserConnector.BEDROCK_PACKET_CODEC);
|
JsonNode certData;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
JSONObject chainData = (JSONObject) JSONValue.parse(loginPacket.getChainData().array());
|
certData = LoginEncryptionUtils.JSON_MAPPER.readTree(loginPacket.getChainData().toByteArray());
|
||||||
JSONArray chainArray = (JSONArray) chainData.get("chain");
|
} catch (IOException ex) {
|
||||||
|
throw new RuntimeException("Certificate JSON can not be read.");
|
||||||
|
}
|
||||||
|
|
||||||
Object identityObject = chainArray.get(chainArray.size() - 1);
|
JsonNode certChainData = certData.get("chain");
|
||||||
|
if (certChainData.getNodeType() != JsonNodeType.ARRAY) {
|
||||||
|
throw new RuntimeException("Certificate data is not valid");
|
||||||
|
}
|
||||||
|
|
||||||
JWSObject identity = JWSObject.parse((String) identityObject);
|
boolean validChain;
|
||||||
JSONObject extraData = (JSONObject) identity.getPayload().toJSONObject().get("extraData");
|
try {
|
||||||
|
validChain = LoginEncryptionUtils.validateChainData(certChainData);
|
||||||
|
|
||||||
|
connector.getLogger().debug(String.format("Is player data valid? %s", validChain));
|
||||||
|
|
||||||
|
JWSObject jwt = JWSObject.parse(certChainData.get(certChainData.size() - 1).asText());
|
||||||
|
JsonNode payload = LoginEncryptionUtils.JSON_MAPPER.readTree(jwt.getPayload().toBytes());
|
||||||
|
|
||||||
|
if (payload.get("extraData").getNodeType() != JsonNodeType.OBJECT) {
|
||||||
|
throw new RuntimeException("AuthData was not found!");
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONObject extraData = (JSONObject) jwt.getPayload().toJSONObject().get("extraData");
|
||||||
session.setAuthenticationData(new BedrockAuthData(extraData.getAsString("displayName"), UUID.fromString(extraData.getAsString("identity")), extraData.getAsString("XUID")));
|
session.setAuthenticationData(new BedrockAuthData(extraData.getAsString("displayName"), UUID.fromString(extraData.getAsString("identity")), extraData.getAsString("XUID")));
|
||||||
|
|
||||||
|
if (payload.get("identityPublicKey").getNodeType() != JsonNodeType.STRING) {
|
||||||
|
throw new RuntimeException("Identity Public Key was not found!");
|
||||||
|
}
|
||||||
|
|
||||||
|
ECPublicKey identityPublicKey = EncryptionUtils.generateKey(payload.get("identityPublicKey").textValue());
|
||||||
|
JWSObject clientJwt = JWSObject.parse(loginPacket.getSkinData().toString());
|
||||||
|
EncryptionUtils.verifyJwt(clientJwt, identityPublicKey);
|
||||||
|
|
||||||
|
if (EncryptionUtils.canUseEncryption()) {
|
||||||
|
startEncryptionHandshake(identityPublicKey);
|
||||||
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
session.getUpstream().disconnect("An internal error occurred when connecting to this server.");
|
session.disconnect("disconnectionScreen.internalError.cantConnect");
|
||||||
ex.printStackTrace();
|
throw new RuntimeException("Unable to complete login", ex);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayStatusPacket playStatus = new PlayStatusPacket();
|
PlayStatusPacket playStatus = new PlayStatusPacket();
|
||||||
|
@ -125,11 +158,7 @@ public class UpstreamPacketHandler implements BedrockPacketHandler {
|
||||||
@Override
|
@Override
|
||||||
public boolean handle(AnimatePacket packet) {
|
public boolean handle(AnimatePacket packet) {
|
||||||
connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName());
|
connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName());
|
||||||
switch (packet.getAction()) {
|
Registry.BEDROCK.translate(packet.getClass(), packet, session);
|
||||||
case SWING_ARM:
|
|
||||||
ClientPlayerSwingArmPacket swingArmPacket = new ClientPlayerSwingArmPacket(Hand.MAIN_HAND);
|
|
||||||
session.getDownstream().getSession().send(swingArmPacket);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,15 +213,7 @@ public class UpstreamPacketHandler implements BedrockPacketHandler {
|
||||||
@Override
|
@Override
|
||||||
public boolean handle(CommandRequestPacket packet) {
|
public boolean handle(CommandRequestPacket packet) {
|
||||||
connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName());
|
connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName());
|
||||||
|
Registry.BEDROCK.translate(packet.getClass(), packet, session);
|
||||||
String command = packet.getCommand().replace("/", "");
|
|
||||||
if (connector.getCommandMap().getCommands().containsKey(command)) {
|
|
||||||
connector.getCommandMap().runCommand(session, command);
|
|
||||||
} else {
|
|
||||||
ClientChatPacket chatPacket = new ClientChatPacket(packet.getCommand());
|
|
||||||
session.getDownstream().getSession().send(chatPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,16 +476,7 @@ public class UpstreamPacketHandler implements BedrockPacketHandler {
|
||||||
@Override
|
@Override
|
||||||
public boolean handle(TextPacket packet) {
|
public boolean handle(TextPacket packet) {
|
||||||
connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName());
|
connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName());
|
||||||
|
Registry.BEDROCK.translate(packet.getClass(), packet, session);
|
||||||
if (packet.getMessage().charAt(0) == '.') {
|
|
||||||
ClientChatPacket chatPacket = new ClientChatPacket(packet.getMessage().replace(".", "/"));
|
|
||||||
session.getDownstream().getSession().send(chatPacket);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ClientChatPacket chatPacket = new ClientChatPacket(packet.getMessage());
|
|
||||||
session.getDownstream().getSession().send(chatPacket);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -959,4 +971,18 @@ public class UpstreamPacketHandler implements BedrockPacketHandler {
|
||||||
connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName());
|
connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void startEncryptionHandshake(PublicKey key) throws Exception {
|
||||||
|
KeyPairGenerator generator = KeyPairGenerator.getInstance("EC");
|
||||||
|
generator.initialize(new ECGenParameterSpec("secp384r1"));
|
||||||
|
KeyPair serverKeyPair = generator.generateKeyPair();
|
||||||
|
|
||||||
|
byte[] token = EncryptionUtils.generateRandomToken();
|
||||||
|
SecretKey encryptionKey = EncryptionUtils.getSecretKey(serverKeyPair.getPrivate(), key, token);
|
||||||
|
session.getUpstream().enableEncryption(encryptionKey);
|
||||||
|
|
||||||
|
ServerToClientHandshakePacket packet = new ServerToClientHandshakePacket();
|
||||||
|
packet.setJwt(EncryptionUtils.createHandshakeJwt(serverKeyPair, token).serialize());
|
||||||
|
session.getUpstream().sendPacketImmediately(packet);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -50,6 +50,7 @@ import org.geysermc.api.RemoteServer;
|
||||||
import org.geysermc.api.session.AuthData;
|
import org.geysermc.api.session.AuthData;
|
||||||
import org.geysermc.api.window.FormWindow;
|
import org.geysermc.api.window.FormWindow;
|
||||||
import org.geysermc.connector.GeyserConnector;
|
import org.geysermc.connector.GeyserConnector;
|
||||||
|
import org.geysermc.connector.network.session.cache.InventoryCache;
|
||||||
import org.geysermc.connector.network.session.cache.WindowCache;
|
import org.geysermc.connector.network.session.cache.WindowCache;
|
||||||
import org.geysermc.connector.network.translators.Registry;
|
import org.geysermc.connector.network.translators.Registry;
|
||||||
import org.geysermc.connector.utils.Toolbox;
|
import org.geysermc.connector.utils.Toolbox;
|
||||||
|
@ -67,11 +68,12 @@ public class GeyserSession implements PlayerSession, Player {
|
||||||
@Getter
|
@Getter
|
||||||
private Client downstream;
|
private Client downstream;
|
||||||
|
|
||||||
private final GeyserSession THIS = this;
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private AuthData authenticationData;
|
private AuthData authenticationData;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private InventoryCache inventoryCache;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private WindowCache windowCache;
|
private WindowCache windowCache;
|
||||||
|
|
||||||
|
@ -84,6 +86,7 @@ public class GeyserSession implements PlayerSession, Player {
|
||||||
this.connector = connector;
|
this.connector = connector;
|
||||||
this.upstream = bedrockServerSession;
|
this.upstream = bedrockServerSession;
|
||||||
|
|
||||||
|
this.inventoryCache = new InventoryCache(this);
|
||||||
this.windowCache = new WindowCache(this);
|
this.windowCache = new WindowCache(this);
|
||||||
|
|
||||||
this.loggedIn = false;
|
this.loggedIn = false;
|
||||||
|
@ -136,7 +139,7 @@ public class GeyserSession implements PlayerSession, Player {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void packetReceived(PacketReceivedEvent event) {
|
public void packetReceived(PacketReceivedEvent event) {
|
||||||
Registry.JAVA.translate(event.getPacket().getClass(), event.getPacket(), THIS);
|
Registry.JAVA.translate(event.getPacket().getClass(), event.getPacket(), GeyserSession.this);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
77
connector/src/main/java/org/geysermc/connector/network/session/cache/InventoryCache.java
vendored
Normal file
77
connector/src/main/java/org/geysermc/connector/network/session/cache/InventoryCache.java
vendored
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.session.cache;
|
||||||
|
|
||||||
|
import com.github.steveice10.packetlib.packet.Packet;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.geysermc.connector.inventory.Inventory;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class InventoryCache {
|
||||||
|
|
||||||
|
private GeyserSession session;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private Inventory openInventory;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private Map<Integer, Inventory> inventories = new HashMap<Integer, Inventory>();
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private Map<Integer, List<Packet>> cachedPackets = new HashMap<Integer, List<Packet>>();
|
||||||
|
|
||||||
|
public InventoryCache(GeyserSession session) {
|
||||||
|
this.session = session;
|
||||||
|
|
||||||
|
// This is the player's inventory
|
||||||
|
inventories.put(0, new Inventory(0, null, 45));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Inventory getPlayerInventory() {
|
||||||
|
return inventories.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cacheInventory(Inventory inventory) {
|
||||||
|
inventories.put(inventory.getId(), inventory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void uncacheInventory(int id) {
|
||||||
|
inventories.remove(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cachePacket(int id, Packet packet) {
|
||||||
|
List<Packet> packets = cachedPackets.getOrDefault(id, new ArrayList<Packet>());
|
||||||
|
packets.add(packet);
|
||||||
|
cachedPackets.put(id, packets);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
package org.geysermc.connector.network.session.cache;
|
package org.geysermc.connector.network.session.cache;
|
||||||
|
|
||||||
import com.nukkitx.protocol.bedrock.packet.ModalFormRequestPacket;
|
import com.nukkitx.protocol.bedrock.packet.ModalFormRequestPacket;
|
||||||
|
@ -12,13 +37,13 @@ public class WindowCache {
|
||||||
|
|
||||||
private GeyserSession session;
|
private GeyserSession session;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private Map<Integer, FormWindow> windows = new HashMap<Integer, FormWindow>();
|
||||||
|
|
||||||
public WindowCache(GeyserSession session) {
|
public WindowCache(GeyserSession session) {
|
||||||
this.session = session;
|
this.session = session;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Getter
|
|
||||||
private Map<Integer, FormWindow> windows = new HashMap<Integer, FormWindow>();
|
|
||||||
|
|
||||||
public void addWindow(FormWindow window) {
|
public void addWindow(FormWindow window) {
|
||||||
windows.put(windows.size() + 1, window);
|
windows.put(windows.size() + 1, window);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators;
|
||||||
|
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
|
||||||
|
public abstract class PacketTranslator<T> {
|
||||||
|
|
||||||
|
public abstract void translate(T packet, GeyserSession session);
|
||||||
|
|
||||||
|
}
|
|
@ -26,28 +26,36 @@
|
||||||
package org.geysermc.connector.network.translators;
|
package org.geysermc.connector.network.translators;
|
||||||
|
|
||||||
import com.github.steveice10.packetlib.packet.Packet;
|
import com.github.steveice10.packetlib.packet.Packet;
|
||||||
|
import com.nukkitx.protocol.bedrock.BedrockPacket;
|
||||||
import org.geysermc.connector.console.GeyserLogger;
|
import org.geysermc.connector.console.GeyserLogger;
|
||||||
import org.geysermc.connector.network.session.GeyserSession;
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
|
|
||||||
public class Registry<T> {
|
public class Registry<T> {
|
||||||
|
|
||||||
private final Map<Class<? extends T>, BiConsumer<? extends T, GeyserSession>> MAP = new HashMap<>();
|
private final Map<Class<? extends T>, PacketTranslator<? extends T>> MAP = new HashMap<>();
|
||||||
|
|
||||||
public static final Registry<Packet> JAVA = new Registry<>();
|
public static final Registry<Packet> JAVA = new Registry<>();
|
||||||
|
public static final Registry<BedrockPacket> BEDROCK = new Registry<>();
|
||||||
|
|
||||||
public static <T extends Packet> void add(Class<T> clazz, BiConsumer<T, GeyserSession> translator) {
|
public static <T extends Packet> void registerJava(Class<T> clazz, PacketTranslator<T> translator) {
|
||||||
JAVA.MAP.put(clazz, translator);
|
JAVA.MAP.put(clazz, translator);
|
||||||
}
|
}
|
||||||
|
|
||||||
public <P extends T> void translate(Class<P> clazz, P p, GeyserSession s) {
|
public static <T extends BedrockPacket> void registerBedrock(Class<T> clazz, PacketTranslator<T> translator) {
|
||||||
|
BEDROCK.MAP.put(clazz, translator);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <P extends T> void translate(Class<? extends P> clazz, P packet, GeyserSession session) {
|
||||||
try {
|
try {
|
||||||
((BiConsumer<P, GeyserSession>) JAVA.MAP.get(clazz)).accept(p, s);
|
if (MAP.containsKey(clazz)) {
|
||||||
} catch (NullPointerException e) {
|
((PacketTranslator<P>) MAP.get(clazz)).translate(packet, session);
|
||||||
GeyserLogger.DEFAULT.debug("could not translate packet " + p.getClass().getSimpleName());
|
}
|
||||||
|
} catch (NullPointerException ex) {
|
||||||
|
GeyserLogger.DEFAULT.debug("Could not translate packet " + packet.getClass().getSimpleName());
|
||||||
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,32 +25,65 @@
|
||||||
|
|
||||||
package org.geysermc.connector.network.translators;
|
package org.geysermc.connector.network.translators;
|
||||||
|
|
||||||
import com.flowpowered.math.vector.Vector3f;
|
import com.github.steveice10.mc.protocol.data.game.window.WindowType;
|
||||||
import com.github.steveice10.mc.protocol.data.message.TranslationMessage;
|
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerChatPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerChatPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerTitlePacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerTitlePacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityDestroyPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityPositionPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityPositionPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityPositionRotationPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityPositionRotationPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityTeleportPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityTeleportPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityVelocityPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityVelocityPacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.spawn.ServerSpawnExpOrbPacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerSetSlotPacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerWindowItemsPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerNotifyClientPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerNotifyClientPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUpdateTimePacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUpdateTimePacket;
|
||||||
import com.nukkitx.nbt.CompoundTagBuilder;
|
import com.nukkitx.nbt.CompoundTagBuilder;
|
||||||
import com.nukkitx.nbt.NbtUtils;
|
import com.nukkitx.nbt.NbtUtils;
|
||||||
import com.nukkitx.nbt.stream.NBTOutputStream;
|
import com.nukkitx.nbt.stream.NBTOutputStream;
|
||||||
import com.nukkitx.nbt.tag.CompoundTag;
|
import com.nukkitx.nbt.tag.CompoundTag;
|
||||||
import com.nukkitx.protocol.bedrock.packet.*;
|
import com.nukkitx.protocol.bedrock.packet.AnimatePacket;
|
||||||
import org.geysermc.connector.utils.MessageUtils;
|
import com.nukkitx.protocol.bedrock.packet.CommandRequestPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.TextPacket;
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.geysermc.connector.network.translators.bedrock.BedrockAnimateTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.bedrock.BedrockCommandRequestTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.bedrock.BedrockTextTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.inventory.GenericInventoryTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.inventory.InventoryTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.item.ItemTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.JavaChatTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.JavaJoinGameTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.entity.JavaEntityDestroyTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.entity.JavaEntityPositionRotationTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.entity.JavaEntityPositionTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.entity.JavaEntityTeleportTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.entity.JavaEntityVelocityTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.entity.spawn.JavaSpawnExpOrbTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.world.JavaNotifyClientTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.window.JavaOpenWindowTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.window.JavaSetSlotTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.JavaTitleTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.world.JavaUpdateTimeTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.java.window.JavaWindowItemsTranslator;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class TranslatorsInit {
|
public class TranslatorsInit {
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private static ItemTranslator itemTranslator;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private static Map<WindowType, InventoryTranslator> inventoryTranslators = new HashMap<WindowType, InventoryTranslator>();
|
||||||
|
|
||||||
private static final CompoundTag EMPTY_TAG = CompoundTagBuilder.builder().buildRootTag();
|
private static final CompoundTag EMPTY_TAG = CompoundTagBuilder.builder().buildRootTag();
|
||||||
private static final byte[] EMPTY_LEVEL_CHUNK_DATA;
|
public static final byte[] EMPTY_LEVEL_CHUNK_DATA;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
|
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
|
||||||
|
@ -67,182 +100,36 @@ public class TranslatorsInit {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void start() {
|
public static void start() {
|
||||||
addLoginPackets();
|
Registry.registerJava(ServerJoinGamePacket.class, new JavaJoinGameTranslator());
|
||||||
addChatPackets();
|
Registry.registerJava(ServerChatPacket.class, new JavaChatTranslator());
|
||||||
addTitlePackets();
|
Registry.registerJava(ServerTitlePacket.class, new JavaTitleTranslator());
|
||||||
addTimePackets();
|
Registry.registerJava(ServerUpdateTimePacket.class, new JavaUpdateTimeTranslator());
|
||||||
addEntityPackets();
|
Registry.registerJava(ServerEntityPositionPacket.class, new JavaEntityPositionTranslator());
|
||||||
addNotifyPackets();
|
Registry.registerJava(ServerEntityPositionRotationPacket.class, new JavaEntityPositionRotationTranslator());
|
||||||
|
Registry.registerJava(ServerEntityTeleportPacket.class, new JavaEntityTeleportTranslator());
|
||||||
|
Registry.registerJava(ServerEntityVelocityPacket.class, new JavaEntityVelocityTranslator());
|
||||||
|
Registry.registerJava(ServerNotifyClientPacket.class, new JavaNotifyClientTranslator());
|
||||||
|
Registry.registerJava(ServerEntityDestroyPacket.class, new JavaEntityDestroyTranslator());
|
||||||
|
Registry.registerJava(ServerSpawnExpOrbPacket.class, new JavaSpawnExpOrbTranslator());
|
||||||
|
Registry.registerJava(ServerWindowItemsPacket.class, new JavaWindowItemsTranslator());
|
||||||
|
Registry.registerJava(ServerOpenWindowPacket.class, new JavaOpenWindowTranslator());
|
||||||
|
Registry.registerJava(ServerSetSlotPacket.class, new JavaSetSlotTranslator());
|
||||||
|
|
||||||
|
Registry.registerBedrock(AnimatePacket.class, new BedrockAnimateTranslator());
|
||||||
|
Registry.registerBedrock(CommandRequestPacket.class, new BedrockCommandRequestTranslator());
|
||||||
|
Registry.registerBedrock(TextPacket.class, new BedrockTextTranslator());
|
||||||
|
|
||||||
|
itemTranslator = new ItemTranslator();
|
||||||
|
|
||||||
|
registerInventoryTranslators();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void addLoginPackets() {
|
private static void registerInventoryTranslators() {
|
||||||
Registry.add(ServerJoinGamePacket.class, (packet, session) -> {
|
inventoryTranslators.put(WindowType.GENERIC_9X1, new GenericInventoryTranslator());
|
||||||
AdventureSettingsPacket bedrockPacket = new AdventureSettingsPacket();
|
inventoryTranslators.put(WindowType.GENERIC_9X2, new GenericInventoryTranslator());
|
||||||
bedrockPacket.setUniqueEntityId(packet.getEntityId());
|
inventoryTranslators.put(WindowType.GENERIC_9X3, new GenericInventoryTranslator());
|
||||||
session.getUpstream().sendPacketImmediately(bedrockPacket);
|
inventoryTranslators.put(WindowType.GENERIC_9X4, new GenericInventoryTranslator());
|
||||||
|
inventoryTranslators.put(WindowType.GENERIC_9X5, new GenericInventoryTranslator());
|
||||||
Vector3f pos = new Vector3f(0, 0, 0);
|
inventoryTranslators.put(WindowType.GENERIC_9X6, new GenericInventoryTranslator());
|
||||||
int chunkX = pos.getFloorX() >> 4;
|
|
||||||
int chunkZ = pos.getFloorZ() >> 4;
|
|
||||||
for (int x = -3; x < 3; x++) {
|
|
||||||
for (int z = -3; z < 3; z++) {
|
|
||||||
LevelChunkPacket data = new LevelChunkPacket();
|
|
||||||
data.setChunkX(chunkX + x);
|
|
||||||
data.setChunkZ(chunkZ + z);
|
|
||||||
data.setSubChunksLength(0);
|
|
||||||
|
|
||||||
data.setData(EMPTY_LEVEL_CHUNK_DATA);
|
|
||||||
|
|
||||||
session.getUpstream().sendPacketImmediately(data);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void addChatPackets() {
|
|
||||||
Registry.add(ServerChatPacket.class, (packet, session) -> {
|
|
||||||
TextPacket textPacket = new TextPacket();
|
|
||||||
textPacket.setPlatformChatId("");
|
|
||||||
textPacket.setSourceName("");
|
|
||||||
textPacket.setXuid(session.getAuthenticationData().getXboxUUID());
|
|
||||||
switch (packet.getType()) {
|
|
||||||
case CHAT:
|
|
||||||
textPacket.setType(TextPacket.Type.CHAT);
|
|
||||||
case SYSTEM:
|
|
||||||
textPacket.setType(TextPacket.Type.SYSTEM);
|
|
||||||
case NOTIFICATION:
|
|
||||||
textPacket.setType(TextPacket.Type.TIP);
|
|
||||||
default:
|
|
||||||
textPacket.setType(TextPacket.Type.RAW);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (packet.getMessage() instanceof TranslationMessage) {
|
|
||||||
textPacket.setType(TextPacket.Type.TRANSLATION);
|
|
||||||
textPacket.setNeedsTranslation(true);
|
|
||||||
textPacket.setParameters(MessageUtils.getTranslationParams(((TranslationMessage) packet.getMessage()).getTranslationParams()));
|
|
||||||
textPacket.setMessage(MessageUtils.getBedrockMessage(packet.getMessage()));
|
|
||||||
} else {
|
|
||||||
textPacket.setNeedsTranslation(false);
|
|
||||||
textPacket.setMessage(MessageUtils.getBedrockMessage(packet.getMessage()));
|
|
||||||
}
|
|
||||||
|
|
||||||
session.getUpstream().sendPacket(textPacket);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void addTitlePackets() {
|
|
||||||
Registry.add(ServerTitlePacket.class, (packet, session) -> {
|
|
||||||
SetTitlePacket titlePacket = new SetTitlePacket();
|
|
||||||
|
|
||||||
switch (packet.getAction()) {
|
|
||||||
case TITLE:
|
|
||||||
titlePacket.setType(SetTitlePacket.Type.SET_TITLE);
|
|
||||||
titlePacket.setText(packet.getTitle().getFullText());
|
|
||||||
break;
|
|
||||||
case SUBTITLE:
|
|
||||||
titlePacket.setType(SetTitlePacket.Type.SET_SUBTITLE);
|
|
||||||
titlePacket.setText(packet.getSubtitle().getFullText());
|
|
||||||
break;
|
|
||||||
case CLEAR:
|
|
||||||
case RESET:
|
|
||||||
titlePacket.setType(SetTitlePacket.Type.RESET_TITLE);
|
|
||||||
titlePacket.setText("");
|
|
||||||
break;
|
|
||||||
case ACTION_BAR:
|
|
||||||
titlePacket.setType(SetTitlePacket.Type.SET_ACTIONBAR_MESSAGE);
|
|
||||||
titlePacket.setText(packet.getActionBar().getFullText());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
titlePacket.setFadeInTime(packet.getFadeIn());
|
|
||||||
titlePacket.setFadeOutTime(packet.getFadeOut());
|
|
||||||
titlePacket.setStayTime(packet.getStay());
|
|
||||||
|
|
||||||
session.getUpstream().sendPacket(titlePacket);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void addTimePackets() {
|
|
||||||
Registry.add(ServerUpdateTimePacket.class, (packet, session) -> {
|
|
||||||
SetTimePacket setTimePacket = new SetTimePacket();
|
|
||||||
setTimePacket.setTime((int) Math.abs(packet.getTime()));
|
|
||||||
|
|
||||||
session.getUpstream().sendPacket(setTimePacket);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void addEntityPackets() {
|
|
||||||
Registry.add(ServerEntityPositionPacket.class, (packet, session) -> {
|
|
||||||
MoveEntityAbsolutePacket moveEntityPacket = new MoveEntityAbsolutePacket();
|
|
||||||
moveEntityPacket.setRuntimeEntityId(packet.getEntityId());
|
|
||||||
moveEntityPacket.setPosition(new Vector3f(packet.getMovementX(), packet.getMovementY(), packet.getMovementZ()));
|
|
||||||
moveEntityPacket.setRotation(new Vector3f(packet.getMovementX(), packet.getMovementY(), packet.getMovementZ()));
|
|
||||||
moveEntityPacket.setOnGround(packet.isOnGround());
|
|
||||||
moveEntityPacket.setTeleported(false);
|
|
||||||
|
|
||||||
session.getUpstream().sendPacket(moveEntityPacket);
|
|
||||||
});
|
|
||||||
|
|
||||||
Registry.add(ServerEntityPositionRotationPacket.class, (packet, session) -> {
|
|
||||||
MoveEntityAbsolutePacket moveEntityPacket = new MoveEntityAbsolutePacket();
|
|
||||||
moveEntityPacket.setRuntimeEntityId(packet.getEntityId());
|
|
||||||
moveEntityPacket.setPosition(new Vector3f(packet.getMovementX(), packet.getMovementY(), packet.getMovementZ()));
|
|
||||||
moveEntityPacket.setRotation(new Vector3f(packet.getMovementX(), packet.getMovementY(), packet.getMovementZ()));
|
|
||||||
moveEntityPacket.setOnGround(true);
|
|
||||||
moveEntityPacket.setTeleported(false);
|
|
||||||
|
|
||||||
session.getUpstream().sendPacket(moveEntityPacket);
|
|
||||||
});
|
|
||||||
|
|
||||||
Registry.add(ServerEntityTeleportPacket.class, (packet, session) -> {
|
|
||||||
MoveEntityAbsolutePacket moveEntityPacket = new MoveEntityAbsolutePacket();
|
|
||||||
moveEntityPacket.setRuntimeEntityId(packet.getEntityId());
|
|
||||||
moveEntityPacket.setPosition(new Vector3f(packet.getX(), packet.getY(), packet.getZ()));
|
|
||||||
moveEntityPacket.setRotation(new Vector3f(packet.getX(), packet.getY(), packet.getZ()));
|
|
||||||
moveEntityPacket.setOnGround(packet.isOnGround());
|
|
||||||
moveEntityPacket.setTeleported(true);
|
|
||||||
|
|
||||||
session.getUpstream().sendPacket(moveEntityPacket);
|
|
||||||
});
|
|
||||||
|
|
||||||
Registry.add(ServerEntityVelocityPacket.class, (packet, session) -> {
|
|
||||||
SetEntityMotionPacket entityMotionPacket = new SetEntityMotionPacket();
|
|
||||||
entityMotionPacket.setRuntimeEntityId(packet.getEntityId());
|
|
||||||
entityMotionPacket.setMotion(new Vector3f(packet.getMotionX(), packet.getMotionY(), packet.getMotionZ()));
|
|
||||||
|
|
||||||
session.getUpstream().sendPacket(entityMotionPacket);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void addNotifyPackets() {
|
|
||||||
Registry.add(ServerNotifyClientPacket.class, (packet, session) -> {
|
|
||||||
switch (packet.getNotification()) {
|
|
||||||
case START_RAIN:
|
|
||||||
LevelEventPacket startRainPacket = new LevelEventPacket();
|
|
||||||
startRainPacket.setEvent(LevelEventPacket.Event.START_RAIN);
|
|
||||||
startRainPacket.setData(ThreadLocalRandom.current().nextInt(50000) + 10000);
|
|
||||||
startRainPacket.setPosition(new Vector3f(0, 0, 0));
|
|
||||||
|
|
||||||
session.getUpstream().sendPacket(startRainPacket);
|
|
||||||
break;
|
|
||||||
case STOP_RAIN:
|
|
||||||
LevelEventPacket stopRainPacket = new LevelEventPacket();
|
|
||||||
stopRainPacket.setEvent(LevelEventPacket.Event.STOP_RAIN);
|
|
||||||
stopRainPacket.setData(ThreadLocalRandom.current().nextInt(50000) + 10000);
|
|
||||||
stopRainPacket.setPosition(new Vector3f(0, 0, 0));
|
|
||||||
|
|
||||||
session.getUpstream().sendPacket(stopRainPacket);
|
|
||||||
break;
|
|
||||||
case ENTER_CREDITS:
|
|
||||||
// ShowCreditsPacket showCreditsPacket = new ShowCreditsPacket();
|
|
||||||
// showCreditsPacket.setStatus(ShowCreditsPacket.Status.START_CREDITS);
|
|
||||||
// showCreditsPacket.setRuntimeEntityId(runtimeEntityId);
|
|
||||||
// session.getUpstream().sendPacket(showCreditsPacket);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.bedrock;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerSwingArmPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.AnimatePacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
|
||||||
|
public class BedrockAnimateTranslator extends PacketTranslator<AnimatePacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(AnimatePacket packet, GeyserSession session) {
|
||||||
|
switch (packet.getAction()) {
|
||||||
|
case SWING_ARM:
|
||||||
|
ClientPlayerSwingArmPacket swingArmPacket = new ClientPlayerSwingArmPacket(Hand.MAIN_HAND);
|
||||||
|
session.getDownstream().getSession().send(swingArmPacket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.bedrock;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.client.ClientChatPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.CommandRequestPacket;
|
||||||
|
import org.geysermc.api.Geyser;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
|
||||||
|
public class BedrockCommandRequestTranslator extends PacketTranslator<CommandRequestPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(CommandRequestPacket packet, GeyserSession session) {
|
||||||
|
String command = packet.getCommand().replace("/", "");
|
||||||
|
if (Geyser.getConnector().getCommandMap().getCommands().containsKey(command)) {
|
||||||
|
Geyser.getConnector().getCommandMap().runCommand(session, command);
|
||||||
|
} else {
|
||||||
|
ClientChatPacket chatPacket = new ClientChatPacket(packet.getCommand());
|
||||||
|
session.getDownstream().getSession().send(chatPacket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.bedrock;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.client.ClientChatPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.TextPacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
|
||||||
|
public class BedrockTextTranslator extends PacketTranslator<TextPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(TextPacket packet, GeyserSession session) {
|
||||||
|
if (packet.getMessage().charAt(0) == '.') {
|
||||||
|
ClientChatPacket chatPacket = new ClientChatPacket(packet.getMessage().replace(".", "/"));
|
||||||
|
session.getDownstream().getSession().send(chatPacket);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClientChatPacket chatPacket = new ClientChatPacket(packet.getMessage());
|
||||||
|
session.getDownstream().getSession().send(chatPacket);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.inventory;
|
||||||
|
|
||||||
|
import com.flowpowered.math.vector.Vector3i;
|
||||||
|
import com.nukkitx.protocol.bedrock.data.ContainerId;
|
||||||
|
import com.nukkitx.protocol.bedrock.data.ItemData;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.InventoryContentPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.InventorySlotPacket;
|
||||||
|
import org.geysermc.connector.inventory.Inventory;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.TranslatorsInit;
|
||||||
|
import org.geysermc.connector.utils.InventoryUtils;
|
||||||
|
|
||||||
|
public class GenericInventoryTranslator extends InventoryTranslator {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void prepareInventory(GeyserSession session, Inventory inventory) {
|
||||||
|
// TODO: Add code here
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void openInventory(GeyserSession session, Inventory inventory) {
|
||||||
|
ContainerOpenPacket containerOpenPacket = new ContainerOpenPacket();
|
||||||
|
containerOpenPacket.setWindowId((byte) inventory.getId());
|
||||||
|
containerOpenPacket.setType((byte) 0);
|
||||||
|
containerOpenPacket.setBlockPosition(new Vector3i(0, 0, 0));
|
||||||
|
session.getUpstream().sendPacket(containerOpenPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateInventory(GeyserSession session, Inventory inventory) {
|
||||||
|
ContainerId containerId = InventoryUtils.getContainerId(inventory.getId());
|
||||||
|
if (containerId == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ItemData[] bedrockItems = new ItemData[inventory.getItems().length];
|
||||||
|
for (int i = 0; i < bedrockItems.length; i++) {
|
||||||
|
bedrockItems[i] = TranslatorsInit.getItemTranslator().translateToBedrock(inventory.getItems()[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
InventoryContentPacket contentPacket = new InventoryContentPacket();
|
||||||
|
contentPacket.setContainerId(containerId);
|
||||||
|
contentPacket.setContents(bedrockItems);
|
||||||
|
session.getUpstream().sendPacket(contentPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateSlot(GeyserSession session, Inventory inventory, int slot) {
|
||||||
|
ContainerId containerId = InventoryUtils.getContainerId(inventory.getId());
|
||||||
|
if (containerId == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
InventorySlotPacket slotPacket = new InventorySlotPacket();
|
||||||
|
slotPacket.setContainerId(containerId);
|
||||||
|
slotPacket.setSlot(TranslatorsInit.getItemTranslator().translateToBedrock(inventory.getItems()[slot]));
|
||||||
|
slotPacket.setInventorySlot(slot);
|
||||||
|
session.getUpstream().sendPacket(slotPacket);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.inventory;
|
||||||
|
|
||||||
|
import org.geysermc.connector.inventory.Inventory;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
|
||||||
|
public abstract class InventoryTranslator {
|
||||||
|
|
||||||
|
public abstract void prepareInventory(GeyserSession session, Inventory inventory);
|
||||||
|
public abstract void openInventory(GeyserSession session, Inventory inventory);
|
||||||
|
public abstract void updateInventory(GeyserSession session, Inventory inventory);
|
||||||
|
public abstract void updateSlot(GeyserSession session, Inventory inventory, int slot);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.item;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class BedrockItem {
|
||||||
|
|
||||||
|
private String identifier;
|
||||||
|
private int id;
|
||||||
|
private int data;
|
||||||
|
}
|
|
@ -0,0 +1,367 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.item;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.ByteArrayTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.ByteTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.DoubleTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.FloatTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.IntArrayTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.IntTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.ListTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.LongArrayTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.LongTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.ShortTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.StringTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.Tag;
|
||||||
|
import com.nukkitx.protocol.bedrock.data.ItemData;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.StartGamePacket;
|
||||||
|
import org.geysermc.connector.utils.Toolbox;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ItemTranslator {
|
||||||
|
|
||||||
|
private static Map<String, String> identifiers = new HashMap<String, String>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
// Key: java translation
|
||||||
|
// Value: bedrock translation
|
||||||
|
identifiers.put("grass_block", "grass");
|
||||||
|
identifiers.put("granite", "stone:1");
|
||||||
|
identifiers.put("polished_granite", "stone:2");
|
||||||
|
identifiers.put("diorite", "stone:3");
|
||||||
|
identifiers.put("polished_diorite", "stone:4");
|
||||||
|
identifiers.put("andesite", "stone:5");
|
||||||
|
identifiers.put("polished_andesite", "stone:6");
|
||||||
|
|
||||||
|
identifiers.put("oak_log", "log");
|
||||||
|
identifiers.put("spruce_log", "log:1");
|
||||||
|
identifiers.put("birch_log", "log:2");
|
||||||
|
identifiers.put("jungle_log", "log:3");
|
||||||
|
identifiers.put("acacia_log", "log:4");
|
||||||
|
identifiers.put("dark_oak_log", "log:5");
|
||||||
|
|
||||||
|
identifiers.put("oak_planks", "planks");
|
||||||
|
identifiers.put("spruce_planks", "planks:1");
|
||||||
|
identifiers.put("birch_planks", "planks:2");
|
||||||
|
identifiers.put("jungle_planks", "planks:3");
|
||||||
|
identifiers.put("acacia_planks", "planks:4");
|
||||||
|
identifiers.put("dark_oak_planks", "planks:5");
|
||||||
|
|
||||||
|
identifiers.put("white_wool", "wool");
|
||||||
|
identifiers.put("orange_wool", "wool:1");
|
||||||
|
identifiers.put("magenta_wool", "wool:2");
|
||||||
|
identifiers.put("light_blue_wool", "wool:3");
|
||||||
|
identifiers.put("yellow_wool", "wool:4");
|
||||||
|
identifiers.put("lime_wool", "wool:5");
|
||||||
|
identifiers.put("pink_wool", "wool:6");
|
||||||
|
identifiers.put("gray_wool", "wool:7");
|
||||||
|
identifiers.put("light_gray_wool", "wool:8");
|
||||||
|
identifiers.put("cyan_wool", "wool:9");
|
||||||
|
identifiers.put("purple_wool", "wool:10");
|
||||||
|
identifiers.put("blue_wool", "wool:11");
|
||||||
|
identifiers.put("brown_wool", "wool:12");
|
||||||
|
identifiers.put("green_wool", "wool:13");
|
||||||
|
identifiers.put("red_wool", "wool:14");
|
||||||
|
identifiers.put("black_wool", "wool:15");
|
||||||
|
|
||||||
|
identifiers.put("white_carpet", "carpet");
|
||||||
|
identifiers.put("orange_carpet", "carpet:1");
|
||||||
|
identifiers.put("magenta_carpet", "carpet:2");
|
||||||
|
identifiers.put("light_blue_carpet", "carpet:3");
|
||||||
|
identifiers.put("yellow_carpet", "carpet:4");
|
||||||
|
identifiers.put("lime_carpet", "carpet:5");
|
||||||
|
identifiers.put("pink_carpet", "carpet:6");
|
||||||
|
identifiers.put("gray_carpet", "carpet:7");
|
||||||
|
identifiers.put("light_gray_carpet", "carpet:8");
|
||||||
|
identifiers.put("cyan_carpet", "carpet:9");
|
||||||
|
identifiers.put("purple_carpet", "carpet:10");
|
||||||
|
identifiers.put("blue_carpet", "carpet:11");
|
||||||
|
identifiers.put("brown_carpet", "carpet:12");
|
||||||
|
identifiers.put("green_carpet", "carpet:13");
|
||||||
|
identifiers.put("red_carpet", "carpet:14");
|
||||||
|
identifiers.put("black_carpet", "carpet:15");
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStack translateToJava(ItemData data) {
|
||||||
|
JavaItem javaItem = getJavaItem(data);
|
||||||
|
|
||||||
|
if (data.getTag() == null) {
|
||||||
|
return new ItemStack(javaItem.getId(), data.getCount());
|
||||||
|
}
|
||||||
|
return new ItemStack(javaItem.getId(), data.getCount(), translateToJavaNBT(data.getTag()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemData translateToBedrock(ItemStack stack) {
|
||||||
|
// Most likely air if null
|
||||||
|
if (stack == null) {
|
||||||
|
return ItemData.AIR;
|
||||||
|
}
|
||||||
|
|
||||||
|
BedrockItem bedrockItem = getBedrockItem(stack);
|
||||||
|
if (stack.getNBT() == null) {
|
||||||
|
return ItemData.of(bedrockItem.getId(), (short) bedrockItem.getData(), stack.getAmount());
|
||||||
|
}
|
||||||
|
return ItemData.of(bedrockItem.getId(), (short) bedrockItem.getData(), stack.getAmount(), translateToBedrockNBT(stack.getNBT()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public BedrockItem getBedrockItem(ItemStack stack) {
|
||||||
|
for (Map.Entry<String, JavaItem> javaItems : Toolbox.JAVA_ITEMS.entrySet()) {
|
||||||
|
if (javaItems.getValue().getId() != stack.getId())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
JavaItem javaItem = javaItems.getValue();
|
||||||
|
String identifier = getBedrockIdentifier(javaItem.getIdentifier().replace("minecraft:", ""));
|
||||||
|
if (!Toolbox.BEDROCK_ITEMS.containsKey(identifier))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return Toolbox.BEDROCK_ITEMS.get(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new BedrockItem("minecraft:air", 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public JavaItem getJavaItem(ItemData data) {
|
||||||
|
for (Map.Entry<String, BedrockItem> bedrockItems : Toolbox.BEDROCK_ITEMS.entrySet()) {
|
||||||
|
if (bedrockItems.getValue().getId() != data.getId())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
String identifier = getJavaIdentifier(bedrockItems.getKey().replace("minecraft:", ""));
|
||||||
|
if (!Toolbox.JAVA_ITEMS.containsKey(identifier))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return Toolbox.JAVA_ITEMS.get(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new JavaItem("minecraft:air", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBedrockIdentifier(String javaIdentifier) {
|
||||||
|
if (!identifiers.containsKey(javaIdentifier))
|
||||||
|
return "minecraft:" + javaIdentifier;
|
||||||
|
|
||||||
|
return "minecraft:" + identifiers.get(javaIdentifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getJavaIdentifier(String bedrockIdentifier) {
|
||||||
|
for (Map.Entry<String, String> entry : identifiers.entrySet()) {
|
||||||
|
if (entry.getValue().equals(bedrockIdentifier)) {
|
||||||
|
return "minecraft:" + entry.getKey();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "minecraft:" + bedrockIdentifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
private CompoundTag translateToJavaNBT(com.nukkitx.nbt.tag.CompoundTag tag) {
|
||||||
|
CompoundTag javaTag = new CompoundTag(tag.getName());
|
||||||
|
Map<String, Tag> javaValue = javaTag.getValue();
|
||||||
|
if (tag.getValue() != null && !tag.getValue().isEmpty()) {
|
||||||
|
for (String str : tag.getValue().keySet()) {
|
||||||
|
com.nukkitx.nbt.tag.Tag bedrockTag = tag.get(str);
|
||||||
|
Tag translatedTag = translateToJavaNBT(bedrockTag);
|
||||||
|
if (translatedTag == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
javaValue.put(str, translatedTag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return javaTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Tag translateToJavaNBT(com.nukkitx.nbt.tag.Tag tag) {
|
||||||
|
if (tag instanceof com.nukkitx.nbt.tag.ByteArrayTag) {
|
||||||
|
com.nukkitx.nbt.tag.ByteArrayTag byteArrayTag = (com.nukkitx.nbt.tag.ByteArrayTag) tag;
|
||||||
|
return new ByteArrayTag(byteArrayTag.getName(), byteArrayTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof com.nukkitx.nbt.tag.ByteTag) {
|
||||||
|
com.nukkitx.nbt.tag.ByteTag byteTag = (com.nukkitx.nbt.tag.ByteTag) tag;
|
||||||
|
return new ByteTag(byteTag.getName(), byteTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof com.nukkitx.nbt.tag.DoubleTag) {
|
||||||
|
com.nukkitx.nbt.tag.DoubleTag doubleTag = (com.nukkitx.nbt.tag.DoubleTag) tag;
|
||||||
|
return new DoubleTag(doubleTag.getName(), doubleTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof com.nukkitx.nbt.tag.FloatTag) {
|
||||||
|
com.nukkitx.nbt.tag.FloatTag floatTag = (com.nukkitx.nbt.tag.FloatTag) tag;
|
||||||
|
return new FloatTag(floatTag.getName(), floatTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof com.nukkitx.nbt.tag.IntArrayTag) {
|
||||||
|
com.nukkitx.nbt.tag.IntArrayTag intArrayTag = (com.nukkitx.nbt.tag.IntArrayTag) tag;
|
||||||
|
return new IntArrayTag(intArrayTag.getName(), intArrayTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof com.nukkitx.nbt.tag.IntTag) {
|
||||||
|
com.nukkitx.nbt.tag.IntTag intTag = (com.nukkitx.nbt.tag.IntTag) tag;
|
||||||
|
return new IntTag(intTag.getName(), intTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof com.nukkitx.nbt.tag.LongArrayTag) {
|
||||||
|
com.nukkitx.nbt.tag.LongArrayTag longArrayTag = (com.nukkitx.nbt.tag.LongArrayTag) tag;
|
||||||
|
return new LongArrayTag(longArrayTag.getName(), longArrayTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof com.nukkitx.nbt.tag.LongTag) {
|
||||||
|
com.nukkitx.nbt.tag.LongTag longTag = (com.nukkitx.nbt.tag.LongTag) tag;
|
||||||
|
return new LongTag(longTag.getName(), longTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof com.nukkitx.nbt.tag.ShortTag) {
|
||||||
|
com.nukkitx.nbt.tag.ShortTag shortTag = (com.nukkitx.nbt.tag.ShortTag) tag;
|
||||||
|
return new ShortTag(shortTag.getName(), shortTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof com.nukkitx.nbt.tag.StringTag) {
|
||||||
|
com.nukkitx.nbt.tag.StringTag stringTag = (com.nukkitx.nbt.tag.StringTag) tag;
|
||||||
|
return new StringTag(stringTag.getName(), stringTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof com.nukkitx.nbt.tag.ListTag) {
|
||||||
|
com.nukkitx.nbt.tag.ListTag listTag = (com.nukkitx.nbt.tag.ListTag) tag;
|
||||||
|
|
||||||
|
List<Tag> tags = new ArrayList<Tag>();
|
||||||
|
for (Object value : listTag.getValue()) {
|
||||||
|
if (!(value instanceof com.nukkitx.nbt.tag.Tag))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
com.nukkitx.nbt.tag.Tag tagValue = (com.nukkitx.nbt.tag.Tag) value;
|
||||||
|
Tag javaTag = translateToJavaNBT(tagValue);
|
||||||
|
if (javaTag != null)
|
||||||
|
tags.add(javaTag);
|
||||||
|
}
|
||||||
|
return new ListTag(listTag.getName(), tags);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof com.nukkitx.nbt.tag.CompoundTag) {
|
||||||
|
return translateToJavaNBT((com.nukkitx.nbt.tag.CompoundTag) tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private com.nukkitx.nbt.tag.CompoundTag translateToBedrockNBT(CompoundTag tag) {
|
||||||
|
Map<String, com.nukkitx.nbt.tag.Tag<?>> javaValue = new HashMap<String, com.nukkitx.nbt.tag.Tag<?>>();
|
||||||
|
if (tag.getValue() != null && !tag.getValue().isEmpty()) {
|
||||||
|
for (String str : tag.getValue().keySet()) {
|
||||||
|
Tag javaTag = tag.get(str);
|
||||||
|
com.nukkitx.nbt.tag.Tag translatedTag = translateToBedrockNBT(javaTag);
|
||||||
|
if (translatedTag == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
javaValue.put(str, translatedTag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
com.nukkitx.nbt.tag.CompoundTag bedrockTag = new com.nukkitx.nbt.tag.CompoundTag(tag.getName(), javaValue);
|
||||||
|
return bedrockTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
private com.nukkitx.nbt.tag.Tag translateToBedrockNBT(Tag tag) {
|
||||||
|
if (tag instanceof ByteArrayTag) {
|
||||||
|
ByteArrayTag byteArrayTag = (ByteArrayTag) tag;
|
||||||
|
return new com.nukkitx.nbt.tag.ByteArrayTag(byteArrayTag.getName(), byteArrayTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof ByteTag) {
|
||||||
|
ByteTag byteTag = (ByteTag) tag;
|
||||||
|
return new com.nukkitx.nbt.tag.ByteTag(byteTag.getName(), byteTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof DoubleTag) {
|
||||||
|
DoubleTag doubleTag = (DoubleTag) tag;
|
||||||
|
return new com.nukkitx.nbt.tag.DoubleTag(doubleTag.getName(), doubleTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof FloatTag) {
|
||||||
|
FloatTag floatTag = (FloatTag) tag;
|
||||||
|
return new com.nukkitx.nbt.tag.FloatTag(floatTag.getName(), floatTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof IntArrayTag) {
|
||||||
|
IntArrayTag intArrayTag = (IntArrayTag) tag;
|
||||||
|
return new com.nukkitx.nbt.tag.IntArrayTag(intArrayTag.getName(), intArrayTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof IntTag) {
|
||||||
|
IntTag intTag = (IntTag) tag;
|
||||||
|
return new com.nukkitx.nbt.tag.IntTag(intTag.getName(), intTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof LongArrayTag) {
|
||||||
|
LongArrayTag longArrayTag = (LongArrayTag) tag;
|
||||||
|
return new com.nukkitx.nbt.tag.LongArrayTag(longArrayTag.getName(), longArrayTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof LongTag) {
|
||||||
|
LongTag longTag = (LongTag) tag;
|
||||||
|
return new com.nukkitx.nbt.tag.LongTag(longTag.getName(), longTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof ShortTag) {
|
||||||
|
ShortTag shortTag = (ShortTag) tag;
|
||||||
|
return new com.nukkitx.nbt.tag.ShortTag(shortTag.getName(), shortTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof StringTag) {
|
||||||
|
StringTag stringTag = (StringTag) tag;
|
||||||
|
return new com.nukkitx.nbt.tag.StringTag(stringTag.getName(), stringTag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof ListTag) {
|
||||||
|
ListTag listTag = (ListTag) tag;
|
||||||
|
|
||||||
|
List<com.nukkitx.nbt.tag.Tag> tags = new ArrayList<com.nukkitx.nbt.tag.Tag>();
|
||||||
|
for (Object value : listTag.getValue()) {
|
||||||
|
if (!(value instanceof Tag))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Tag tagValue = (Tag) value;
|
||||||
|
com.nukkitx.nbt.tag.Tag bedrockTag = translateToBedrockNBT(tagValue);
|
||||||
|
if (bedrockTag != null)
|
||||||
|
tags.add(bedrockTag);
|
||||||
|
}
|
||||||
|
// TODO: Fix unchecked call here
|
||||||
|
return new com.nukkitx.nbt.tag.ListTag(listTag.getName(), listTag.getElementType(), tags);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag instanceof CompoundTag) {
|
||||||
|
return translateToBedrockNBT((CompoundTag) tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.item;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class JavaItem {
|
||||||
|
|
||||||
|
private String identifier;
|
||||||
|
private int id;
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.data.message.TranslationMessage;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerChatPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.TextPacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
import org.geysermc.connector.utils.MessageUtils;
|
||||||
|
|
||||||
|
public class JavaChatTranslator extends PacketTranslator<ServerChatPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerChatPacket packet, GeyserSession session) {
|
||||||
|
TextPacket textPacket = new TextPacket();
|
||||||
|
textPacket.setPlatformChatId("");
|
||||||
|
textPacket.setSourceName("");
|
||||||
|
textPacket.setXuid(session.getAuthenticationData().getXboxUUID());
|
||||||
|
switch (packet.getType()) {
|
||||||
|
case CHAT:
|
||||||
|
textPacket.setType(TextPacket.Type.CHAT);
|
||||||
|
case SYSTEM:
|
||||||
|
textPacket.setType(TextPacket.Type.SYSTEM);
|
||||||
|
case NOTIFICATION:
|
||||||
|
textPacket.setType(TextPacket.Type.TIP);
|
||||||
|
default:
|
||||||
|
textPacket.setType(TextPacket.Type.RAW);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (packet.getMessage() instanceof TranslationMessage) {
|
||||||
|
textPacket.setType(TextPacket.Type.TRANSLATION);
|
||||||
|
textPacket.setNeedsTranslation(true);
|
||||||
|
textPacket.setParameters(MessageUtils.getTranslationParams(((TranslationMessage) packet.getMessage()).getTranslationParams()));
|
||||||
|
textPacket.setMessage(MessageUtils.getBedrockMessage(packet.getMessage()));
|
||||||
|
} else {
|
||||||
|
textPacket.setNeedsTranslation(false);
|
||||||
|
textPacket.setMessage(MessageUtils.getBedrockMessage(packet.getMessage()));
|
||||||
|
}
|
||||||
|
|
||||||
|
session.getUpstream().sendPacket(textPacket);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java;
|
||||||
|
|
||||||
|
import com.flowpowered.math.vector.Vector3f;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.AdventureSettingsPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.LevelChunkPacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.TranslatorsInit;
|
||||||
|
|
||||||
|
public class JavaJoinGameTranslator extends PacketTranslator<ServerJoinGamePacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerJoinGamePacket packet, GeyserSession session) {
|
||||||
|
AdventureSettingsPacket bedrockPacket = new AdventureSettingsPacket();
|
||||||
|
bedrockPacket.setUniqueEntityId(packet.getEntityId());
|
||||||
|
session.getUpstream().sendPacketImmediately(bedrockPacket);
|
||||||
|
|
||||||
|
Vector3f pos = new Vector3f(0, 0, 0);
|
||||||
|
int chunkX = pos.getFloorX() >> 4;
|
||||||
|
int chunkZ = pos.getFloorZ() >> 4;
|
||||||
|
for (int x = -3; x < 3; x++) {
|
||||||
|
for (int z = -3; z < 3; z++) {
|
||||||
|
LevelChunkPacket data = new LevelChunkPacket();
|
||||||
|
data.setChunkX(chunkX + x);
|
||||||
|
data.setChunkZ(chunkZ + z);
|
||||||
|
data.setSubChunksLength(0);
|
||||||
|
|
||||||
|
data.setData(TranslatorsInit.EMPTY_LEVEL_CHUNK_DATA);
|
||||||
|
|
||||||
|
session.getUpstream().sendPacketImmediately(data);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerTitlePacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.SetTitlePacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
|
||||||
|
public class JavaTitleTranslator extends PacketTranslator<ServerTitlePacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerTitlePacket packet, GeyserSession session) {
|
||||||
|
SetTitlePacket titlePacket = new SetTitlePacket();
|
||||||
|
|
||||||
|
switch (packet.getAction()) {
|
||||||
|
case TITLE:
|
||||||
|
titlePacket.setType(SetTitlePacket.Type.SET_TITLE);
|
||||||
|
titlePacket.setText(packet.getTitle().getFullText());
|
||||||
|
break;
|
||||||
|
case SUBTITLE:
|
||||||
|
titlePacket.setType(SetTitlePacket.Type.SET_SUBTITLE);
|
||||||
|
titlePacket.setText(packet.getSubtitle().getFullText());
|
||||||
|
break;
|
||||||
|
case CLEAR:
|
||||||
|
case RESET:
|
||||||
|
titlePacket.setType(SetTitlePacket.Type.RESET_TITLE);
|
||||||
|
titlePacket.setText("");
|
||||||
|
break;
|
||||||
|
case ACTION_BAR:
|
||||||
|
titlePacket.setType(SetTitlePacket.Type.SET_ACTIONBAR_MESSAGE);
|
||||||
|
titlePacket.setText(packet.getActionBar().getFullText());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
titlePacket.setFadeInTime(packet.getFadeIn());
|
||||||
|
titlePacket.setFadeOutTime(packet.getFadeOut());
|
||||||
|
titlePacket.setStayTime(packet.getStay());
|
||||||
|
|
||||||
|
session.getUpstream().sendPacket(titlePacket);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java.entity;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityDestroyPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.RemoveEntityPacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
|
||||||
|
public class JavaEntityDestroyTranslator extends PacketTranslator<ServerEntityDestroyPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerEntityDestroyPacket packet, GeyserSession session) {
|
||||||
|
for (int entityId : packet.getEntityIds()) {
|
||||||
|
RemoveEntityPacket removeEntityPacket = new RemoveEntityPacket();
|
||||||
|
removeEntityPacket.setUniqueEntityId(entityId);
|
||||||
|
|
||||||
|
session.getUpstream().sendPacket(removeEntityPacket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java.entity;
|
||||||
|
|
||||||
|
import com.flowpowered.math.vector.Vector3f;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityPositionRotationPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
|
||||||
|
public class JavaEntityPositionRotationTranslator extends PacketTranslator<ServerEntityPositionRotationPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerEntityPositionRotationPacket packet, GeyserSession session) {
|
||||||
|
MoveEntityAbsolutePacket moveEntityPacket = new MoveEntityAbsolutePacket();
|
||||||
|
moveEntityPacket.setRuntimeEntityId(packet.getEntityId());
|
||||||
|
moveEntityPacket.setPosition(new Vector3f(packet.getMovementX(), packet.getMovementY(), packet.getMovementZ()));
|
||||||
|
moveEntityPacket.setRotation(new Vector3f(packet.getMovementX(), packet.getMovementY(), packet.getMovementZ()));
|
||||||
|
moveEntityPacket.setOnGround(true);
|
||||||
|
moveEntityPacket.setTeleported(false);
|
||||||
|
|
||||||
|
session.getUpstream().sendPacket(moveEntityPacket);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java.entity;
|
||||||
|
|
||||||
|
import com.flowpowered.math.vector.Vector3f;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityPositionPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
|
||||||
|
public class JavaEntityPositionTranslator extends PacketTranslator<ServerEntityPositionPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerEntityPositionPacket packet, GeyserSession session) {
|
||||||
|
MoveEntityAbsolutePacket moveEntityPacket = new MoveEntityAbsolutePacket();
|
||||||
|
moveEntityPacket.setRuntimeEntityId(packet.getEntityId());
|
||||||
|
moveEntityPacket.setPosition(new Vector3f(packet.getMovementX(), packet.getMovementY(), packet.getMovementZ()));
|
||||||
|
moveEntityPacket.setRotation(new Vector3f(packet.getMovementX(), packet.getMovementY(), packet.getMovementZ()));
|
||||||
|
moveEntityPacket.setOnGround(packet.isOnGround());
|
||||||
|
moveEntityPacket.setTeleported(false);
|
||||||
|
|
||||||
|
session.getUpstream().sendPacket(moveEntityPacket);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java.entity;
|
||||||
|
|
||||||
|
import com.flowpowered.math.vector.Vector3f;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityTeleportPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
|
||||||
|
public class JavaEntityTeleportTranslator extends PacketTranslator<ServerEntityTeleportPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerEntityTeleportPacket packet, GeyserSession session) {
|
||||||
|
MoveEntityAbsolutePacket moveEntityPacket = new MoveEntityAbsolutePacket();
|
||||||
|
moveEntityPacket.setRuntimeEntityId(packet.getEntityId());
|
||||||
|
moveEntityPacket.setPosition(new Vector3f(packet.getX(), packet.getY(), packet.getZ()));
|
||||||
|
moveEntityPacket.setRotation(new Vector3f(packet.getX(), packet.getY(), packet.getZ()));
|
||||||
|
moveEntityPacket.setOnGround(packet.isOnGround());
|
||||||
|
moveEntityPacket.setTeleported(true);
|
||||||
|
|
||||||
|
session.getUpstream().sendPacket(moveEntityPacket);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java.entity;
|
||||||
|
|
||||||
|
import com.flowpowered.math.vector.Vector3f;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityVelocityPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.SetEntityMotionPacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
|
||||||
|
public class JavaEntityVelocityTranslator extends PacketTranslator<ServerEntityVelocityPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerEntityVelocityPacket packet, GeyserSession session) {
|
||||||
|
SetEntityMotionPacket entityMotionPacket = new SetEntityMotionPacket();
|
||||||
|
entityMotionPacket.setRuntimeEntityId(packet.getEntityId());
|
||||||
|
entityMotionPacket.setMotion(new Vector3f(packet.getMotionX(), packet.getMotionY(), packet.getMotionZ()));
|
||||||
|
|
||||||
|
session.getUpstream().sendPacket(entityMotionPacket);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package org.geysermc.connector.network.translators.java.entity.spawn;
|
||||||
|
|
||||||
|
import com.flowpowered.math.vector.Vector3f;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.spawn.ServerSpawnExpOrbPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.SpawnExperienceOrbPacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
|
||||||
|
public class JavaSpawnExpOrbTranslator extends PacketTranslator<ServerSpawnExpOrbPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerSpawnExpOrbPacket packet, GeyserSession session) {
|
||||||
|
SpawnExperienceOrbPacket spawnExperienceOrbPacket = new SpawnExperienceOrbPacket();
|
||||||
|
spawnExperienceOrbPacket.setPosition(new Vector3f(packet.getX(), packet.getY(), packet.getZ()));
|
||||||
|
spawnExperienceOrbPacket.setAmount(packet.getExp());
|
||||||
|
|
||||||
|
session.getUpstream().sendPacket(spawnExperienceOrbPacket);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java.window;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
import org.geysermc.connector.utils.InventoryUtils;
|
||||||
|
|
||||||
|
public class JavaOpenWindowTranslator extends PacketTranslator<ServerOpenWindowPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerOpenWindowPacket packet, GeyserSession session) {
|
||||||
|
InventoryUtils.openInventory(session, packet);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java.window;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerSetSlotPacket;
|
||||||
|
import org.geysermc.connector.inventory.Inventory;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.session.cache.InventoryCache;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
import org.geysermc.connector.utils.InventoryUtils;
|
||||||
|
|
||||||
|
public class JavaSetSlotTranslator extends PacketTranslator<ServerSetSlotPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerSetSlotPacket packet, GeyserSession session) {
|
||||||
|
InventoryCache inventoryCache = session.getInventoryCache();
|
||||||
|
if (!inventoryCache.getInventories().containsKey(packet.getWindowId())) {
|
||||||
|
inventoryCache.cachePacket(packet.getWindowId(), packet);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Inventory inventory = inventoryCache.getInventories().get(packet.getWindowId());
|
||||||
|
if (packet.getWindowId() != 0 && inventory.getWindowType() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Player inventory
|
||||||
|
if (packet.getWindowId() == 0) {
|
||||||
|
if (packet.getSlot() >= inventory.getItems().length)
|
||||||
|
return; // Most likely not a player inventory
|
||||||
|
|
||||||
|
ItemStack[] items = inventory.getItems();
|
||||||
|
items[packet.getSlot()] = packet.getItem();
|
||||||
|
inventory.setItems(items);
|
||||||
|
|
||||||
|
InventoryUtils.refreshPlayerInventory(session, inventory);
|
||||||
|
|
||||||
|
if (inventory.isOpen()) {
|
||||||
|
InventoryUtils.updateSlot(session, packet);
|
||||||
|
} else {
|
||||||
|
inventoryCache.cachePacket(packet.getWindowId(), packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java.window;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerWindowItemsPacket;
|
||||||
|
import org.geysermc.connector.inventory.Inventory;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.session.cache.InventoryCache;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
import org.geysermc.connector.utils.InventoryUtils;
|
||||||
|
|
||||||
|
public class JavaWindowItemsTranslator extends PacketTranslator<ServerWindowItemsPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerWindowItemsPacket packet, GeyserSession session) {
|
||||||
|
InventoryCache inventoryCache = session.getInventoryCache();
|
||||||
|
if (!inventoryCache.getInventories().containsKey(packet.getWindowId())) {
|
||||||
|
inventoryCache.cachePacket(packet.getWindowId(), packet);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Inventory inventory = inventoryCache.getInventories().get(packet.getWindowId());
|
||||||
|
// Player inventory
|
||||||
|
if (packet.getWindowId() == 0) {
|
||||||
|
inventory.setItems(packet.getItems());
|
||||||
|
InventoryUtils.refreshPlayerInventory(session, inventory);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
InventoryUtils.updateInventory(session, packet);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java.world;
|
||||||
|
|
||||||
|
import com.flowpowered.math.vector.Vector3f;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerNotifyClientPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.LevelEventPacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
|
public class JavaNotifyClientTranslator extends PacketTranslator<ServerNotifyClientPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerNotifyClientPacket packet, GeyserSession session) {
|
||||||
|
switch (packet.getNotification()) {
|
||||||
|
case START_RAIN:
|
||||||
|
LevelEventPacket startRainPacket = new LevelEventPacket();
|
||||||
|
startRainPacket.setEvent(LevelEventPacket.Event.START_RAIN);
|
||||||
|
startRainPacket.setData(ThreadLocalRandom.current().nextInt(50000) + 10000);
|
||||||
|
startRainPacket.setPosition(new Vector3f(0, 0, 0));
|
||||||
|
|
||||||
|
session.getUpstream().sendPacket(startRainPacket);
|
||||||
|
break;
|
||||||
|
case STOP_RAIN:
|
||||||
|
LevelEventPacket stopRainPacket = new LevelEventPacket();
|
||||||
|
stopRainPacket.setEvent(LevelEventPacket.Event.STOP_RAIN);
|
||||||
|
stopRainPacket.setData(ThreadLocalRandom.current().nextInt(50000) + 10000);
|
||||||
|
stopRainPacket.setPosition(new Vector3f(0, 0, 0));
|
||||||
|
|
||||||
|
session.getUpstream().sendPacket(stopRainPacket);
|
||||||
|
break;
|
||||||
|
case ENTER_CREDITS:
|
||||||
|
// ShowCreditsPacket showCreditsPacket = new ShowCreditsPacket();
|
||||||
|
// showCreditsPacket.setStatus(ShowCreditsPacket.Status.START_CREDITS);
|
||||||
|
// showCreditsPacket.setRuntimeEntityId(runtimeEntityId);
|
||||||
|
// session.getUpstream().sendPacket(showCreditsPacket);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.java.world;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUpdateTimePacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.SetTimePacket;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
|
||||||
|
public class JavaUpdateTimeTranslator extends PacketTranslator<ServerUpdateTimePacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerUpdateTimePacket packet, GeyserSession session) {
|
||||||
|
SetTimePacket setTimePacket = new SetTimePacket();
|
||||||
|
setTimePacket.setTime((int) Math.abs(packet.getTime()));
|
||||||
|
|
||||||
|
session.getUpstream().sendPacket(setTimePacket);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,122 @@
|
||||||
|
package org.geysermc.connector.utils;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientCloseWindowPacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerSetSlotPacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerWindowItemsPacket;
|
||||||
|
import com.github.steveice10.packetlib.packet.Packet;
|
||||||
|
import com.nukkitx.protocol.bedrock.data.ContainerId;
|
||||||
|
import com.nukkitx.protocol.bedrock.data.ItemData;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.InventoryContentPacket;
|
||||||
|
import org.geysermc.api.Geyser;
|
||||||
|
import org.geysermc.connector.inventory.Inventory;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.TranslatorsInit;
|
||||||
|
import org.geysermc.connector.network.translators.inventory.InventoryTranslator;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
public class InventoryUtils {
|
||||||
|
|
||||||
|
public static void refreshPlayerInventory(GeyserSession session, Inventory inventory) {
|
||||||
|
InventoryContentPacket inventoryContentPacket = new InventoryContentPacket();
|
||||||
|
inventoryContentPacket.setContainerId(ContainerId.INVENTORY);
|
||||||
|
|
||||||
|
ItemData[] contents = new ItemData[40];
|
||||||
|
// Inventory
|
||||||
|
for (int i = 9; i < 36; i++) {
|
||||||
|
contents[i] = TranslatorsInit.getItemTranslator().translateToBedrock(inventory.getItems()[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hotbar
|
||||||
|
for (int i = 36; i < 45; i++) {
|
||||||
|
contents[i - 36] = TranslatorsInit.getItemTranslator().translateToBedrock(inventory.getItems()[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Armor
|
||||||
|
for (int i = 5; i < 9; i++) {
|
||||||
|
contents[i + 31] = TranslatorsInit.getItemTranslator().translateToBedrock(inventory.getItems()[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
inventoryContentPacket.setContents(contents);
|
||||||
|
session.getUpstream().sendPacket(inventoryContentPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void openInventory(GeyserSession session, ServerOpenWindowPacket packet) {
|
||||||
|
Inventory inventory = new Inventory(packet.getWindowId(), packet.getType(), 45); // TODO: Find a way to set this value
|
||||||
|
session.getInventoryCache().getInventories().put(packet.getWindowId(), inventory);
|
||||||
|
session.getInventoryCache().setOpenInventory(inventory);
|
||||||
|
|
||||||
|
InventoryTranslator translator = TranslatorsInit.getInventoryTranslators().get(inventory.getWindowType());
|
||||||
|
translator.prepareInventory(session, inventory);
|
||||||
|
Geyser.getGeneralThreadPool().schedule(() -> {
|
||||||
|
List<Packet> packets = session.getInventoryCache().getCachedPackets().get(inventory.getId());
|
||||||
|
packets.forEach(itemPacket -> {
|
||||||
|
if (itemPacket != null) {
|
||||||
|
if (ServerWindowItemsPacket.class.isAssignableFrom(itemPacket.getClass())) {
|
||||||
|
updateInventory(session, (ServerWindowItemsPacket) itemPacket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, 200, TimeUnit.MILLISECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateInventory(GeyserSession session, ServerWindowItemsPacket packet) {
|
||||||
|
if (packet.getWindowId() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (session.getInventoryCache().getOpenInventory() == null || !session.getInventoryCache().getInventories().containsKey(packet.getWindowId()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Inventory openInventory = session.getInventoryCache().getOpenInventory();
|
||||||
|
if (packet.getWindowId() != openInventory.getId())
|
||||||
|
return;
|
||||||
|
|
||||||
|
InventoryTranslator translator = TranslatorsInit.getInventoryTranslators().get(openInventory.getWindowType());
|
||||||
|
if (translator == null) {
|
||||||
|
session.getDownstream().getSession().send(new ClientCloseWindowPacket(packet.getWindowId()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
openInventory.setItems(packet.getItems());
|
||||||
|
translator.updateInventory(session, openInventory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateSlot(GeyserSession session, ServerSetSlotPacket packet) {
|
||||||
|
if (packet.getWindowId() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (session.getInventoryCache().getOpenInventory() == null || !session.getInventoryCache().getInventories().containsKey(packet.getWindowId()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Inventory openInventory = session.getInventoryCache().getOpenInventory();
|
||||||
|
if (packet.getWindowId() != openInventory.getId())
|
||||||
|
return;
|
||||||
|
|
||||||
|
InventoryTranslator translator = TranslatorsInit.getInventoryTranslators().get(openInventory.getWindowType());
|
||||||
|
if (translator == null) {
|
||||||
|
session.getDownstream().getSession().send(new ClientCloseWindowPacket(packet.getWindowId()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (packet.getSlot() >= openInventory.getSize()) {
|
||||||
|
session.getDownstream().getSession().send(new ClientCloseWindowPacket(packet.getWindowId()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemStack[] items = openInventory.getItems();
|
||||||
|
items[packet.getSlot()] = packet.getItem();
|
||||||
|
translator.updateSlot(session, openInventory, packet.getSlot());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ContainerId getContainerId(int id) {
|
||||||
|
for (ContainerId value : ContainerId.values()) {
|
||||||
|
if (value.id() == id)
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package org.geysermc.connector.utils;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.fasterxml.jackson.databind.node.JsonNodeType;
|
||||||
|
import com.nimbusds.jose.JWSObject;
|
||||||
|
import com.nukkitx.network.util.Preconditions;
|
||||||
|
import com.nukkitx.protocol.bedrock.util.EncryptionUtils;
|
||||||
|
|
||||||
|
import java.security.interfaces.ECPublicKey;
|
||||||
|
|
||||||
|
public class LoginEncryptionUtils {
|
||||||
|
|
||||||
|
public static final ObjectMapper JSON_MAPPER = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
|
||||||
|
|
||||||
|
public static boolean validateChainData(JsonNode data) throws Exception {
|
||||||
|
ECPublicKey lastKey = null;
|
||||||
|
boolean validChain = false;
|
||||||
|
for (JsonNode node : data) {
|
||||||
|
JWSObject jwt = JWSObject.parse(node.asText());
|
||||||
|
|
||||||
|
if (!validChain) {
|
||||||
|
validChain = EncryptionUtils.verifyJwt(jwt, EncryptionUtils.getMojangPublicKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastKey != null) {
|
||||||
|
EncryptionUtils.verifyJwt(jwt, lastKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonNode payloadNode = JSON_MAPPER.readTree(jwt.getPayload().toString());
|
||||||
|
JsonNode ipkNode = payloadNode.get("identityPublicKey");
|
||||||
|
Preconditions.checkState(ipkNode != null && ipkNode.getNodeType() == JsonNodeType.STRING, "identityPublicKey node is missing in chain");
|
||||||
|
lastKey = EncryptionUtils.generateKey(ipkNode.asText());
|
||||||
|
}
|
||||||
|
return validChain;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,11 +1,14 @@
|
||||||
package org.geysermc.connector.utils;
|
package org.geysermc.connector.utils;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.nukkitx.network.VarInts;
|
import com.nukkitx.network.VarInts;
|
||||||
import com.nukkitx.protocol.bedrock.packet.StartGamePacket;
|
import com.nukkitx.protocol.bedrock.packet.StartGamePacket;
|
||||||
import com.nukkitx.protocol.bedrock.v361.BedrockUtils;
|
import com.nukkitx.protocol.bedrock.v361.BedrockUtils;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
|
import org.geysermc.connector.network.translators.item.BedrockItem;
|
||||||
|
import org.geysermc.connector.network.translators.item.JavaItem;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
@ -23,6 +26,16 @@ public class Toolbox {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map<String, BedrockItem> bedrockItems = new HashMap<String, BedrockItem>();
|
||||||
|
for (Map<String, Object> e : entries) {
|
||||||
|
BedrockItem bedrockItem = new BedrockItem((String) e.get("name"), (int) e.get("id"), (int) e.get("data"));
|
||||||
|
if (bedrockItem.getData() != 0) {
|
||||||
|
bedrockItems.put(bedrockItem.getIdentifier() + ":" + bedrockItem.getData(), bedrockItem);
|
||||||
|
} else {
|
||||||
|
bedrockItems.put(bedrockItem.getIdentifier(), bedrockItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ByteBuf b = Unpooled.buffer();
|
ByteBuf b = Unpooled.buffer();
|
||||||
VarInts.writeUnsignedInt(b, entries.size());
|
VarInts.writeUnsignedInt(b, entries.size());
|
||||||
for (Map<String, Object> e : entries) {
|
for (Map<String, Object> e : entries) {
|
||||||
|
@ -46,17 +59,43 @@ public class Toolbox {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
ArrayList<StartGamePacket.ItemEntry> l = new ArrayList<>();
|
List<StartGamePacket.ItemEntry> l = new ArrayList<>();
|
||||||
for (HashMap e : s) {
|
for (HashMap e : s) {
|
||||||
l.add(new StartGamePacket.ItemEntry((String) e.get("name"), (short) ((int) e.get("id"))));
|
l.add(new StartGamePacket.ItemEntry((String) e.get("name"), (short) ((int) e.get("id"))));
|
||||||
|
if (!bedrockItems.containsKey(e.get("name"))) {
|
||||||
|
BedrockItem bedrockItem = new BedrockItem((String) e.get("name"), ((int) e.get("id")), 0);
|
||||||
|
bedrockItems.put(bedrockItem.getIdentifier(), bedrockItem);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ITEMS = l;
|
ITEMS = l;
|
||||||
|
|
||||||
|
BEDROCK_ITEMS = bedrockItems;
|
||||||
|
|
||||||
|
InputStream javaItemStream = Toolbox.class.getClassLoader().getResourceAsStream("java_items.json");
|
||||||
|
ObjectMapper javaItemMapper = new ObjectMapper();
|
||||||
|
Map<String, HashMap> javaItemList = new HashMap<String, HashMap>();
|
||||||
|
try {
|
||||||
|
javaItemList = javaItemMapper.readValue(javaItemStream, new TypeReference<Map<String, HashMap>>(){});
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, JavaItem> javaItems = new HashMap<String, JavaItem>();
|
||||||
|
|
||||||
|
for (String str : javaItemList.keySet()) {
|
||||||
|
javaItems.put(str, new JavaItem(str, (int) javaItemList.get(str).get("protocol_id")));
|
||||||
|
}
|
||||||
|
|
||||||
|
JAVA_ITEMS = javaItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Collection<StartGamePacket.ItemEntry> ITEMS;
|
public static final Collection<StartGamePacket.ItemEntry> ITEMS;
|
||||||
|
|
||||||
public static final ByteBuf CACHED_PALLETE;
|
public static final ByteBuf CACHED_PALLETE;
|
||||||
|
|
||||||
|
public static final Map<String, BedrockItem> BEDROCK_ITEMS;
|
||||||
|
public static final Map<String, JavaItem> JAVA_ITEMS;
|
||||||
|
|
||||||
//public static final byte[] EMPTY_CHUNK;
|
//public static final byte[] EMPTY_CHUNK;
|
||||||
}
|
}
|
2633
connector/src/main/resources/java_items.json
Normal file
2633
connector/src/main/resources/java_items.json
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue