mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Merge branch 'master' of https://github.com/GeyserMC/Geyser into mcprotocollibupdate
This commit is contained in:
commit
1015b830ce
11 changed files with 84 additions and 26 deletions
|
@ -1,4 +1,4 @@
|
||||||
<img src="https://geysermc.org/img/geyserlogo.png" alt="Geyser" width="600"/>
|
<img src="https://geysermc.org/img/geyser-1760-860.png" alt="Geyser" width="600"/>
|
||||||
|
|
||||||
[![forthebadge made-with-java](http://ForTheBadge.com/images/badges/made-with-java.svg)](https://java.com/)
|
[![forthebadge made-with-java](http://ForTheBadge.com/images/badges/made-with-java.svg)](https://java.com/)
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ import us.myles.ViaVersion.api.Via;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
@ -154,6 +155,11 @@ public class GeyserBukkitPlugin extends JavaPlugin implements GeyserBootstrap {
|
||||||
return this.geyserWorldManager;
|
return this.geyserWorldManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Path getConfigFolder() {
|
||||||
|
return getDataFolder().toPath();
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isCompatible(String version, String whichVersion) {
|
public boolean isCompatible(String version, String whichVersion) {
|
||||||
int[] currentVersion = parseVersion(version);
|
int[] currentVersion = parseVersion(version);
|
||||||
int[] otherVersion = parseVersion(whichVersion);
|
int[] otherVersion = parseVersion(whichVersion);
|
||||||
|
@ -187,4 +193,5 @@ public class GeyserBukkitPlugin extends JavaPlugin implements GeyserBootstrap {
|
||||||
}
|
}
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@ import org.geysermc.platform.bungeecord.command.GeyserBungeeCommandManager;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
@ -134,4 +135,9 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap {
|
||||||
public IGeyserPingPassthrough getGeyserPingPassthrough() {
|
public IGeyserPingPassthrough getGeyserPingPassthrough() {
|
||||||
return geyserBungeePingPassthrough;
|
return geyserBungeePingPassthrough;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Path getConfigFolder() {
|
||||||
|
return getDataFolder().toPath();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,7 @@ import org.spongepowered.api.plugin.Plugin;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Plugin(id = "geyser", name = GeyserConnector.NAME + "-Sponge", version = GeyserConnector.VERSION, url = "https://geysermc.org", authors = "GeyserMC")
|
@Plugin(id = "geyser", name = GeyserConnector.NAME + "-Sponge", version = GeyserConnector.VERSION, url = "https://geysermc.org", authors = "GeyserMC")
|
||||||
|
@ -147,6 +148,11 @@ public class GeyserSpongePlugin implements GeyserBootstrap {
|
||||||
return geyserSpongePingPassthrough;
|
return geyserSpongePingPassthrough;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Path getConfigFolder() {
|
||||||
|
return configDir.toPath();
|
||||||
|
}
|
||||||
|
|
||||||
@Listener
|
@Listener
|
||||||
public void onServerStart(GameStartedServerEvent event) {
|
public void onServerStart(GameStartedServerEvent event) {
|
||||||
onEnable();
|
onEnable();
|
||||||
|
|
|
@ -37,6 +37,8 @@ import org.geysermc.platform.standalone.command.GeyserCommandManager;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class GeyserStandaloneBootstrap implements GeyserBootstrap {
|
public class GeyserStandaloneBootstrap implements GeyserBootstrap {
|
||||||
|
@ -100,4 +102,10 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap {
|
||||||
public IGeyserPingPassthrough getGeyserPingPassthrough() {
|
public IGeyserPingPassthrough getGeyserPingPassthrough() {
|
||||||
return geyserPingPassthrough;
|
return geyserPingPassthrough;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Path getConfigFolder() {
|
||||||
|
// Return the current working directory
|
||||||
|
return Paths.get(System.getProperty("user.dir"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ import com.velocitypowered.api.event.proxy.ProxyShutdownEvent;
|
||||||
import com.velocitypowered.api.plugin.Plugin;
|
import com.velocitypowered.api.plugin.Plugin;
|
||||||
|
|
||||||
import com.velocitypowered.api.proxy.ProxyServer;
|
import com.velocitypowered.api.proxy.ProxyServer;
|
||||||
|
import lombok.Getter;
|
||||||
import org.geysermc.common.PlatformType;
|
import org.geysermc.common.PlatformType;
|
||||||
import org.geysermc.connector.configuration.GeyserConfiguration;
|
import org.geysermc.connector.configuration.GeyserConfiguration;
|
||||||
import org.geysermc.connector.GeyserConnector;
|
import org.geysermc.connector.GeyserConnector;
|
||||||
|
@ -48,6 +49,8 @@ import org.slf4j.Logger;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Plugin(id = "geyser", name = GeyserConnector.NAME + "-Velocity", version = GeyserConnector.VERSION, url = "https://geysermc.org", authors = "GeyserMC")
|
@Plugin(id = "geyser", name = GeyserConnector.NAME + "-Velocity", version = GeyserConnector.VERSION, url = "https://geysermc.org", authors = "GeyserMC")
|
||||||
|
@ -69,14 +72,16 @@ public class GeyserVelocityPlugin implements GeyserBootstrap {
|
||||||
|
|
||||||
private GeyserConnector connector;
|
private GeyserConnector connector;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final Path configFolder = Paths.get("plugins/" + GeyserConnector.NAME + "-Velocity/");
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
File configDir = new File("plugins/" + GeyserConnector.NAME + "-Velocity/");
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!configDir.exists())
|
if (!configFolder.toFile().exists())
|
||||||
configDir.mkdir();
|
//noinspection ResultOfMethodCallIgnored
|
||||||
File configFile = FileUtils.fileOrCopiedFromResource(new File(configDir, "config.yml"), "config.yml", (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString()));
|
configFolder.toFile().mkdirs();
|
||||||
|
File configFile = FileUtils.fileOrCopiedFromResource(configFolder.resolve("config.yml").toFile(), "config.yml", (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString()));
|
||||||
this.geyserConfig = FileUtils.loadConfig(configFile, GeyserVelocityConfiguration.class);
|
this.geyserConfig = FileUtils.loadConfig(configFile, GeyserVelocityConfiguration.class);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
logger.warn("Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex);
|
logger.warn("Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex);
|
||||||
|
@ -101,7 +106,7 @@ public class GeyserVelocityPlugin implements GeyserBootstrap {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
geyserConfig.loadFloodgate(this, proxyServer, configDir);
|
geyserConfig.loadFloodgate(this, proxyServer, configFolder.toFile());
|
||||||
|
|
||||||
this.connector = GeyserConnector.start(PlatformType.VELOCITY, this);
|
this.connector = GeyserConnector.start(PlatformType.VELOCITY, this);
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ import com.nukkitx.protocol.bedrock.BedrockPacketCodec;
|
||||||
import com.nukkitx.protocol.bedrock.BedrockServer;
|
import com.nukkitx.protocol.bedrock.BedrockServer;
|
||||||
import com.nukkitx.protocol.bedrock.v390.Bedrock_v390;
|
import com.nukkitx.protocol.bedrock.v390.Bedrock_v390;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
import org.geysermc.common.AuthType;
|
import org.geysermc.common.AuthType;
|
||||||
import org.geysermc.common.PlatformType;
|
import org.geysermc.common.PlatformType;
|
||||||
import org.geysermc.connector.bootstrap.GeyserBootstrap;
|
import org.geysermc.connector.bootstrap.GeyserBootstrap;
|
||||||
|
@ -79,6 +80,7 @@ public class GeyserConnector {
|
||||||
private static GeyserConnector instance;
|
private static GeyserConnector instance;
|
||||||
|
|
||||||
private RemoteServer remoteServer;
|
private RemoteServer remoteServer;
|
||||||
|
@Setter
|
||||||
private AuthType authType;
|
private AuthType authType;
|
||||||
|
|
||||||
private boolean shuttingDown = false;
|
private boolean shuttingDown = false;
|
||||||
|
|
|
@ -33,6 +33,8 @@ import org.geysermc.connector.command.CommandManager;
|
||||||
import org.geysermc.connector.network.translators.world.CachedChunkManager;
|
import org.geysermc.connector.network.translators.world.CachedChunkManager;
|
||||||
import org.geysermc.connector.network.translators.world.WorldManager;
|
import org.geysermc.connector.network.translators.world.WorldManager;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
public interface GeyserBootstrap {
|
public interface GeyserBootstrap {
|
||||||
|
|
||||||
CachedChunkManager DEFAULT_CHUNK_MANAGER = new CachedChunkManager();
|
CachedChunkManager DEFAULT_CHUNK_MANAGER = new CachedChunkManager();
|
||||||
|
@ -83,4 +85,11 @@ public interface GeyserBootstrap {
|
||||||
default WorldManager getWorldManager() {
|
default WorldManager getWorldManager() {
|
||||||
return DEFAULT_CHUNK_MANAGER;
|
return DEFAULT_CHUNK_MANAGER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the data folder where files get stored
|
||||||
|
*
|
||||||
|
* @return Path location of data folder
|
||||||
|
*/
|
||||||
|
Path getConfigFolder();
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
package org.geysermc.connector.network.translators.bedrock;
|
package org.geysermc.connector.network.translators.bedrock;
|
||||||
|
|
||||||
import com.nukkitx.protocol.bedrock.data.EntityData;
|
import com.nukkitx.protocol.bedrock.data.EntityData;
|
||||||
|
import com.nukkitx.protocol.bedrock.data.EntityDataMap;
|
||||||
import com.nukkitx.protocol.bedrock.data.EntityFlag;
|
import com.nukkitx.protocol.bedrock.data.EntityFlag;
|
||||||
import org.geysermc.connector.entity.Entity;
|
import org.geysermc.connector.entity.Entity;
|
||||||
import org.geysermc.connector.network.session.GeyserSession;
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
@ -74,33 +75,43 @@ public class BedrockInteractTranslator extends PacketTranslator<InteractPacket>
|
||||||
Entity interactEntity = session.getEntityCache().getEntityByGeyserId(packet.getRuntimeEntityId());
|
Entity interactEntity = session.getEntityCache().getEntityByGeyserId(packet.getRuntimeEntityId());
|
||||||
if (interactEntity == null)
|
if (interactEntity == null)
|
||||||
return;
|
return;
|
||||||
|
EntityDataMap entityMetadata = interactEntity.getMetadata();
|
||||||
|
|
||||||
String interactiveTag;
|
String interactiveTag;
|
||||||
switch (interactEntity.getEntityType()) {
|
switch (interactEntity.getEntityType()) {
|
||||||
case PIG:
|
case BOAT:
|
||||||
if (interactEntity.getMetadata().getFlags().getFlag(EntityFlag.SADDLED)) {
|
interactiveTag = "action.interact.ride.boat";
|
||||||
interactiveTag = "action.interact.mount";
|
|
||||||
} else interactiveTag = "";
|
|
||||||
break;
|
break;
|
||||||
case HORSE:
|
|
||||||
case SKELETON_HORSE:
|
|
||||||
case ZOMBIE_HORSE:
|
|
||||||
case DONKEY:
|
case DONKEY:
|
||||||
case MULE:
|
case HORSE:
|
||||||
case LLAMA:
|
case LLAMA:
|
||||||
|
case MULE:
|
||||||
|
case SKELETON_HORSE:
|
||||||
case TRADER_LLAMA:
|
case TRADER_LLAMA:
|
||||||
if (interactEntity.getMetadata().getFlags().getFlag(EntityFlag.TAMED)) {
|
case ZOMBIE_HORSE:
|
||||||
|
if (entityMetadata.getFlags().getFlag(EntityFlag.TAMED)) {
|
||||||
interactiveTag = "action.interact.ride.horse";
|
interactiveTag = "action.interact.ride.horse";
|
||||||
} else {
|
} else {
|
||||||
interactiveTag = "action.interact.mount";
|
interactiveTag = "action.interact.mount";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BOAT:
|
|
||||||
interactiveTag = "action.interact.ride.boat";
|
|
||||||
break;
|
|
||||||
case MINECART:
|
case MINECART:
|
||||||
interactiveTag = "action.interact.ride.minecart";
|
interactiveTag = "action.interact.ride.minecart";
|
||||||
break;
|
break;
|
||||||
|
case PIG:
|
||||||
|
if (entityMetadata.getFlags().getFlag(EntityFlag.SADDLED)) {
|
||||||
|
interactiveTag = "action.interact.mount";
|
||||||
|
} else interactiveTag = "";
|
||||||
|
break;
|
||||||
|
case VILLAGER:
|
||||||
|
if (entityMetadata.getInt(EntityData.VARIANT) != 14 && entityMetadata.getInt(EntityData.VARIANT) != 0
|
||||||
|
&& entityMetadata.getFloat(EntityData.SCALE) >= 0.75f) { // Not a nitwit, has a profession and is not a baby
|
||||||
|
interactiveTag = "action.interact.trade";
|
||||||
|
} else interactiveTag = "";
|
||||||
|
break;
|
||||||
|
case WANDERING_TRADER:
|
||||||
|
interactiveTag = "action.interact.trade"; // Since you can always trade with a wandering villager, presumably.
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return; // No need to process any further since there is no interactive tag
|
return; // No need to process any further since there is no interactive tag
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ import org.geysermc.connector.GeyserConnector;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.zip.ZipFile;
|
import java.util.zip.ZipFile;
|
||||||
|
@ -49,7 +50,8 @@ public class LocaleUtils {
|
||||||
|
|
||||||
static {
|
static {
|
||||||
// Create the locales folder
|
// Create the locales folder
|
||||||
File localesFolder = new File("locales/");
|
File localesFolder = GeyserConnector.getInstance().getBootstrap().getConfigFolder().resolve("locales").toFile();
|
||||||
|
//noinspection ResultOfMethodCallIgnored
|
||||||
localesFolder.mkdir();
|
localesFolder.mkdir();
|
||||||
|
|
||||||
// Download the latest asset list and cache it
|
// Download the latest asset list and cache it
|
||||||
|
@ -132,7 +134,7 @@ public class LocaleUtils {
|
||||||
* @param locale Locale to download
|
* @param locale Locale to download
|
||||||
*/
|
*/
|
||||||
private static void downloadLocale(String locale) {
|
private static void downloadLocale(String locale) {
|
||||||
File localeFile = new File("locales/" + locale + ".json");
|
File localeFile = Paths.get(GeyserConnector.getInstance().getBootstrap().getConfigFolder().toString(),"locales",locale + ".json").toFile();
|
||||||
|
|
||||||
// Check if we have already downloaded the locale file
|
// Check if we have already downloaded the locale file
|
||||||
if (localeFile.exists()) {
|
if (localeFile.exists()) {
|
||||||
|
@ -149,7 +151,7 @@ public class LocaleUtils {
|
||||||
|
|
||||||
// Get the hash and download the locale
|
// Get the hash and download the locale
|
||||||
String hash = ASSET_MAP.get("minecraft/lang/" + locale + ".json").getHash();
|
String hash = ASSET_MAP.get("minecraft/lang/" + locale + ".json").getHash();
|
||||||
WebUtils.downloadFile("http://resources.download.minecraft.net/" + hash.substring(0, 2) + "/" + hash, "locales/" + locale + ".json");
|
WebUtils.downloadFile("http://resources.download.minecraft.net/" + hash.substring(0, 2) + "/" + hash, localeFile.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -205,10 +207,11 @@ public class LocaleUtils {
|
||||||
GeyserConnector.getInstance().getLogger().debug("Download URL: " + smallestURL);
|
GeyserConnector.getInstance().getLogger().debug("Download URL: " + smallestURL);
|
||||||
|
|
||||||
// Download the smallest JAR (client or server)
|
// Download the smallest JAR (client or server)
|
||||||
WebUtils.downloadFile(smallestURL, "tmp_locale.jar");
|
Path tmpFilePath = GeyserConnector.getInstance().getBootstrap().getConfigFolder().resolve("tmp_locale.jar");
|
||||||
|
WebUtils.downloadFile(smallestURL, tmpFilePath.toString());
|
||||||
|
|
||||||
// Load in the JAR as a zip and extract the file
|
// Load in the JAR as a zip and extract the file
|
||||||
ZipFile localeJar = new ZipFile("tmp_locale.jar");
|
ZipFile localeJar = new ZipFile(tmpFilePath.toString());
|
||||||
InputStream inputStream = localeJar.getInputStream(localeJar.getEntry("assets/minecraft/lang/en_us.json"));
|
InputStream inputStream = localeJar.getInputStream(localeJar.getEntry("assets/minecraft/lang/en_us.json"));
|
||||||
FileOutputStream outputStream = new FileOutputStream(localeFile);
|
FileOutputStream outputStream = new FileOutputStream(localeFile);
|
||||||
|
|
||||||
|
@ -227,7 +230,7 @@ public class LocaleUtils {
|
||||||
localeJar.close();
|
localeJar.close();
|
||||||
|
|
||||||
// Delete the nolonger needed client/server jar
|
// Delete the nolonger needed client/server jar
|
||||||
Files.delete(Paths.get("tmp_locale.jar"));
|
Files.delete(tmpFilePath);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new AssertionError("Unable to download and extract en_us locale!", e);
|
throw new AssertionError("Unable to download and extract en_us locale!", e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,8 @@
|
||||||
# --------------------------------
|
# --------------------------------
|
||||||
|
|
||||||
bedrock:
|
bedrock:
|
||||||
# The IP address that will listen for connections
|
# The IP address that will listen for connections.
|
||||||
|
# There is no reason to change this unless you want to limit what IPs can connect to your server.
|
||||||
address: 0.0.0.0
|
address: 0.0.0.0
|
||||||
# The port that will listen for connections
|
# The port that will listen for connections
|
||||||
port: 19132
|
port: 19132
|
||||||
|
|
Loading…
Reference in a new issue