mirror of
https://github.com/GeyserMC/Geyser.git
synced 2025-12-22 08:19:20 +00:00
1.21.90 support (#5589)
* Initial changes for 1.21.90 * Update Bedrock protocol, fix camera present serializer * yeet debug * Set auth chain data * Update dependencies, add bstats metrics for haproxy usage
This commit is contained in:
@@ -15,7 +15,7 @@ The ultimate goal of this project is to allow Minecraft: Bedrock Edition users t
|
|||||||
Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have joined us here!
|
Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have joined us here!
|
||||||
|
|
||||||
## Supported Versions
|
## Supported Versions
|
||||||
Geyser is currently supporting Minecraft Bedrock 1.21.50 - 1.21.82 and Minecraft Java 1.21.5. For more information, please see [here](https://geysermc.org/wiki/geyser/supported-versions/).
|
Geyser is currently supporting Minecraft Bedrock 1.21.50 - 1.21.90 and Minecraft Java 1.21.5. For more information, please see [here](https://geysermc.org/wiki/geyser/supported-versions/).
|
||||||
|
|
||||||
## Setting Up
|
## Setting Up
|
||||||
Take a look [here](https://geysermc.org/wiki/geyser/setup/) for how to set up Geyser.
|
Take a look [here](https://geysermc.org/wiki/geyser/setup/) for how to set up Geyser.
|
||||||
|
|||||||
@@ -113,4 +113,14 @@ public abstract class SessionLoadResourcePacksEvent extends ConnectionEvent {
|
|||||||
* @since 2.1.1
|
* @since 2.1.1
|
||||||
*/
|
*/
|
||||||
public abstract boolean unregister(@NonNull UUID uuid);
|
public abstract boolean unregister(@NonNull UUID uuid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether to forcefully disable vibrant visuals for joining clients.
|
||||||
|
* While vibrant visuals are nice to look at, they can cause issues with
|
||||||
|
* some resource packs.
|
||||||
|
*
|
||||||
|
* @param enabled Whether vibrant visuals are allowed. This is true by default.
|
||||||
|
* @since 2.7.2
|
||||||
|
*/
|
||||||
|
public abstract void allowVibrantVisuals(boolean enabled);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -479,6 +479,8 @@ public class GeyserImpl implements GeyserApi, EventRegistrar {
|
|||||||
metrics.addCustomChart(new Metrics.SimplePie("platform", platformType::platformName));
|
metrics.addCustomChart(new Metrics.SimplePie("platform", platformType::platformName));
|
||||||
metrics.addCustomChart(new Metrics.SimplePie("defaultLocale", GeyserLocale::getDefaultLocale));
|
metrics.addCustomChart(new Metrics.SimplePie("defaultLocale", GeyserLocale::getDefaultLocale));
|
||||||
metrics.addCustomChart(new Metrics.SimplePie("version", () -> GeyserImpl.VERSION));
|
metrics.addCustomChart(new Metrics.SimplePie("version", () -> GeyserImpl.VERSION));
|
||||||
|
metrics.addCustomChart(new Metrics.SimplePie("javaHaProxyProtocol", () -> String.valueOf(config.getRemote().isUseProxyProtocol())));
|
||||||
|
metrics.addCustomChart(new Metrics.SimplePie("bedrockHaProxyProtocol", () -> String.valueOf(config.getBedrock().isEnableProxyProtocol())));
|
||||||
metrics.addCustomChart(new Metrics.AdvancedPie("playerPlatform", () -> {
|
metrics.addCustomChart(new Metrics.AdvancedPie("playerPlatform", () -> {
|
||||||
Map<String, Integer> valueMap = new HashMap<>();
|
Map<String, Integer> valueMap = new HashMap<>();
|
||||||
for (GeyserSession session : sessionManager.getAllSessions()) {
|
for (GeyserSession session : sessionManager.getAllSessions()) {
|
||||||
|
|||||||
@@ -70,8 +70,11 @@ public class SessionLoadResourcePacksEventImpl extends SessionLoadResourcePacksE
|
|||||||
*/
|
*/
|
||||||
private final Map<UUID, OptionHolder> sessionPackOptionOverrides;
|
private final Map<UUID, OptionHolder> sessionPackOptionOverrides;
|
||||||
|
|
||||||
|
private final GeyserSession session;
|
||||||
|
|
||||||
public SessionLoadResourcePacksEventImpl(GeyserSession session) {
|
public SessionLoadResourcePacksEventImpl(GeyserSession session) {
|
||||||
super(session);
|
super(session);
|
||||||
|
this.session = session;
|
||||||
this.packs = new Object2ObjectLinkedOpenHashMap<>(Registries.RESOURCE_PACKS.get());
|
this.packs = new Object2ObjectLinkedOpenHashMap<>(Registries.RESOURCE_PACKS.get());
|
||||||
this.sessionPackOptionOverrides = new Object2ObjectOpenHashMap<>();
|
this.sessionPackOptionOverrides = new Object2ObjectOpenHashMap<>();
|
||||||
}
|
}
|
||||||
@@ -160,6 +163,11 @@ public class SessionLoadResourcePacksEventImpl extends SessionLoadResourcePacksE
|
|||||||
return packs.remove(uuid) != null;
|
return packs.remove(uuid) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void allowVibrantVisuals(boolean enabled) {
|
||||||
|
session.setAllowVibrantVisuals(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
private void attemptRegisterOptions(@NonNull GeyserResourcePack pack, @Nullable ResourcePackOption<?>... options) {
|
private void attemptRegisterOptions(@NonNull GeyserResourcePack pack, @Nullable ResourcePackOption<?>... options) {
|
||||||
if (options == null) {
|
if (options == null) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import org.cloudburstmc.protocol.bedrock.codec.v766.Bedrock_v766;
|
|||||||
import org.cloudburstmc.protocol.bedrock.codec.v776.Bedrock_v776;
|
import org.cloudburstmc.protocol.bedrock.codec.v776.Bedrock_v776;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v786.Bedrock_v786;
|
import org.cloudburstmc.protocol.bedrock.codec.v786.Bedrock_v786;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v800.Bedrock_v800;
|
import org.cloudburstmc.protocol.bedrock.codec.v800.Bedrock_v800;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.codec.v818.Bedrock_v818;
|
||||||
import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec;
|
import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.mcprotocollib.protocol.codec.MinecraftCodec;
|
import org.geysermc.mcprotocollib.protocol.codec.MinecraftCodec;
|
||||||
@@ -49,8 +50,8 @@ public final class GameProtocol {
|
|||||||
* Default Bedrock codec that should act as a fallback. Should represent the latest available
|
* Default Bedrock codec that should act as a fallback. Should represent the latest available
|
||||||
* release of the game that Geyser supports.
|
* release of the game that Geyser supports.
|
||||||
*/
|
*/
|
||||||
public static final BedrockCodec DEFAULT_BEDROCK_CODEC = CodecProcessor.processCodec(Bedrock_v800.CODEC.toBuilder()
|
public static final BedrockCodec DEFAULT_BEDROCK_CODEC = CodecProcessor.processCodec(Bedrock_v818.CODEC.toBuilder()
|
||||||
.minecraftVersion("1.21.80")
|
.minecraftVersion("1.21.90")
|
||||||
.build());
|
.build());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -74,6 +75,9 @@ public final class GameProtocol {
|
|||||||
SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v786.CODEC.toBuilder()
|
SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v786.CODEC.toBuilder()
|
||||||
.minecraftVersion("1.21.70 - 1.21.73")
|
.minecraftVersion("1.21.70 - 1.21.73")
|
||||||
.build()));
|
.build()));
|
||||||
|
SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v800.CODEC.toBuilder()
|
||||||
|
.minecraftVersion("1.21.80 - 1.21.84")
|
||||||
|
.build()));
|
||||||
SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC);
|
SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,6 +113,10 @@ public final class GameProtocol {
|
|||||||
return session.protocolVersion() >= Bedrock_v800.CODEC.getProtocolVersion();
|
return session.protocolVersion() >= Bedrock_v800.CODEC.getProtocolVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean is1_21_90orHigher(GeyserSession session) {
|
||||||
|
return session.protocolVersion() >= Bedrock_v818.CODEC.getProtocolVersion();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the {@link PacketCodec} for Minecraft: Java Edition.
|
* Gets the {@link PacketCodec} for Minecraft: Java Edition.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -208,6 +208,7 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
|
|||||||
|
|
||||||
ResourcePacksInfoPacket resourcePacksInfo = new ResourcePacksInfoPacket();
|
ResourcePacksInfoPacket resourcePacksInfo = new ResourcePacksInfoPacket();
|
||||||
resourcePacksInfo.getResourcePackInfos().addAll(this.resourcePackLoadEvent.infoPacketEntries());
|
resourcePacksInfo.getResourcePackInfos().addAll(this.resourcePackLoadEvent.infoPacketEntries());
|
||||||
|
resourcePacksInfo.setVibrantVisualsForceDisabled(!session.isAllowVibrantVisuals());
|
||||||
|
|
||||||
resourcePacksInfo.setForcedToAccept(GeyserImpl.getInstance().getConfig().isForceResourcePacks());
|
resourcePacksInfo.setForcedToAccept(GeyserImpl.getInstance().getConfig().isForceResourcePacks());
|
||||||
resourcePacksInfo.setWorldTemplateId(UUID.randomUUID());
|
resourcePacksInfo.setWorldTemplateId(UUID.randomUUID());
|
||||||
@@ -241,7 +242,9 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
|
|||||||
stackPacket.setGameVersion(session.getClientData().getGameVersion());
|
stackPacket.setGameVersion(session.getClientData().getGameVersion());
|
||||||
stackPacket.getResourcePacks().addAll(this.resourcePackLoadEvent.orderedPacks());
|
stackPacket.getResourcePacks().addAll(this.resourcePackLoadEvent.orderedPacks());
|
||||||
// Allows Vibrant Visuals to be toggled in the settings
|
// Allows Vibrant Visuals to be toggled in the settings
|
||||||
|
if (session.isAllowVibrantVisuals() && !GameProtocol.is1_21_90orHigher(session)) {
|
||||||
stackPacket.getExperiments().add(new ExperimentData("experimental_graphics", true));
|
stackPacket.getExperiments().add(new ExperimentData("experimental_graphics", true));
|
||||||
|
}
|
||||||
|
|
||||||
session.sendUpstreamPacket(stackPacket);
|
session.sendUpstreamPacket(stackPacket);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import org.cloudburstmc.protocol.bedrock.codec.v766.Bedrock_v766;
|
|||||||
import org.cloudburstmc.protocol.bedrock.codec.v776.Bedrock_v776;
|
import org.cloudburstmc.protocol.bedrock.codec.v776.Bedrock_v776;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v786.Bedrock_v786;
|
import org.cloudburstmc.protocol.bedrock.codec.v786.Bedrock_v786;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v800.Bedrock_v800;
|
import org.cloudburstmc.protocol.bedrock.codec.v800.Bedrock_v800;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.codec.v818.Bedrock_v818;
|
||||||
import org.geysermc.geyser.GeyserBootstrap;
|
import org.geysermc.geyser.GeyserBootstrap;
|
||||||
import org.geysermc.geyser.GeyserImpl;
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
import org.geysermc.geyser.item.type.Item;
|
import org.geysermc.geyser.item.type.Item;
|
||||||
@@ -73,7 +74,8 @@ public final class TagRegistryPopulator {
|
|||||||
ObjectIntPair.of("1_21_60", Bedrock_v776.CODEC.getProtocolVersion()),
|
ObjectIntPair.of("1_21_60", Bedrock_v776.CODEC.getProtocolVersion()),
|
||||||
ObjectIntPair.of("1_21_70", Bedrock_v786.CODEC.getProtocolVersion()),
|
ObjectIntPair.of("1_21_70", Bedrock_v786.CODEC.getProtocolVersion()),
|
||||||
// Not a typo, they're the same file
|
// Not a typo, they're the same file
|
||||||
ObjectIntPair.of("1_21_70", Bedrock_v800.CODEC.getProtocolVersion())
|
ObjectIntPair.of("1_21_70", Bedrock_v800.CODEC.getProtocolVersion()),
|
||||||
|
ObjectIntPair.of("1_21_70", Bedrock_v818.CODEC.getProtocolVersion())
|
||||||
);
|
);
|
||||||
Type type = new TypeToken<Map<String, List<String>>>() {}.getType();
|
Type type = new TypeToken<Map<String, List<String>>>() {}.getType();
|
||||||
|
|
||||||
|
|||||||
@@ -689,6 +689,9 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||||||
@Setter
|
@Setter
|
||||||
private int stepTicks = 0;
|
private int stepTicks = 0;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
private boolean allowVibrantVisuals = true;
|
||||||
|
|
||||||
public GeyserSession(GeyserImpl geyser, BedrockServerSession bedrockServerSession, EventLoop tickEventLoop) {
|
public GeyserSession(GeyserImpl geyser, BedrockServerSession bedrockServerSession, EventLoop tickEventLoop) {
|
||||||
this.geyser = geyser;
|
this.geyser = geyser;
|
||||||
this.upstream = new UpstreamSession(bedrockServerSession);
|
this.upstream = new UpstreamSession(bedrockServerSession);
|
||||||
@@ -1620,7 +1623,9 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||||||
// Needed for certain molang queries used in blocks and items
|
// Needed for certain molang queries used in blocks and items
|
||||||
startGamePacket.getExperiments().add(new ExperimentData("experimental_molang_features", true));
|
startGamePacket.getExperiments().add(new ExperimentData("experimental_molang_features", true));
|
||||||
// Allows Vibrant Visuals to appear in the settings menu
|
// Allows Vibrant Visuals to appear in the settings menu
|
||||||
|
if (allowVibrantVisuals && !GameProtocol.is1_21_90orHigher(this)) {
|
||||||
startGamePacket.getExperiments().add(new ExperimentData("experimental_graphics", true));
|
startGamePacket.getExperiments().add(new ExperimentData("experimental_graphics", true));
|
||||||
|
}
|
||||||
|
|
||||||
startGamePacket.setVanillaVersion("*");
|
startGamePacket.setVanillaVersion("*");
|
||||||
startGamePacket.setInventoriesServerAuthoritative(true);
|
startGamePacket.setInventoriesServerAuthoritative(true);
|
||||||
@@ -1638,6 +1643,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||||||
startGamePacket.setServerId("");
|
startGamePacket.setServerId("");
|
||||||
startGamePacket.setWorldId("");
|
startGamePacket.setWorldId("");
|
||||||
startGamePacket.setScenarioId("");
|
startGamePacket.setScenarioId("");
|
||||||
|
startGamePacket.setOwnerId("");
|
||||||
|
|
||||||
upstream.sendPacket(startGamePacket);
|
upstream.sendPacket(startGamePacket);
|
||||||
}
|
}
|
||||||
@@ -1680,7 +1686,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||||||
/**
|
/**
|
||||||
* Queue a packet to be sent to player.
|
* Queue a packet to be sent to player.
|
||||||
*
|
*
|
||||||
* @param packet the bedrock packet from the NukkitX protocol lib
|
* @param packet the bedrock packet from the Cloudburst protocol lib
|
||||||
*/
|
*/
|
||||||
public void sendUpstreamPacket(BedrockPacket packet) {
|
public void sendUpstreamPacket(BedrockPacket packet) {
|
||||||
upstream.sendPacket(packet);
|
upstream.sendPacket(packet);
|
||||||
@@ -1689,7 +1695,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||||||
/**
|
/**
|
||||||
* Send a packet immediately to the player.
|
* Send a packet immediately to the player.
|
||||||
*
|
*
|
||||||
* @param packet the bedrock packet from the NukkitX protocol lib
|
* @param packet the bedrock packet from the Cloudburst protocol lib
|
||||||
*/
|
*/
|
||||||
public void sendUpstreamPacketImmediately(BedrockPacket packet) {
|
public void sendUpstreamPacketImmediately(BedrockPacket packet) {
|
||||||
upstream.sendPacketImmediately(packet);
|
upstream.sendPacketImmediately(packet);
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
|
|||||||
import com.fasterxml.jackson.databind.JsonNode;
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import net.raphimc.minecraftauth.step.msa.StepMsaDeviceCode;
|
import net.raphimc.minecraftauth.step.msa.StepMsaDeviceCode;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.data.auth.AuthPayload;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.data.auth.CertificateChainPayload;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.LoginPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.LoginPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.ServerToClientHandshakePacket;
|
import org.cloudburstmc.protocol.bedrock.packet.ServerToClientHandshakePacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.util.ChainValidationResult;
|
import org.cloudburstmc.protocol.bedrock.util.ChainValidationResult;
|
||||||
@@ -58,14 +60,14 @@ public class LoginEncryptionUtils {
|
|||||||
private static boolean HAS_SENT_ENCRYPTION_MESSAGE = false;
|
private static boolean HAS_SENT_ENCRYPTION_MESSAGE = false;
|
||||||
|
|
||||||
public static void encryptPlayerConnection(GeyserSession session, LoginPacket loginPacket) {
|
public static void encryptPlayerConnection(GeyserSession session, LoginPacket loginPacket) {
|
||||||
encryptConnectionWithCert(session, loginPacket.getExtra(), loginPacket.getChain());
|
encryptConnectionWithCert(session, loginPacket.getAuthPayload(), loginPacket.getClientJwt());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void encryptConnectionWithCert(GeyserSession session, String clientData, List<String> certChainData) {
|
private static void encryptConnectionWithCert(GeyserSession session, AuthPayload authPayload, String jwt) {
|
||||||
try {
|
try {
|
||||||
GeyserImpl geyser = session.getGeyser();
|
GeyserImpl geyser = session.getGeyser();
|
||||||
|
|
||||||
ChainValidationResult result = EncryptionUtils.validateChain(certChainData);
|
ChainValidationResult result = EncryptionUtils.validatePayload(authPayload);
|
||||||
|
|
||||||
geyser.getLogger().debug(String.format("Is player data signed? %s", result.signed()));
|
geyser.getLogger().debug(String.format("Is player data signed? %s", result.signed()));
|
||||||
|
|
||||||
@@ -75,19 +77,25 @@ public class LoginEncryptionUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
IdentityData extraData = result.identityClaims().extraData;
|
IdentityData extraData = result.identityClaims().extraData;
|
||||||
|
// TODO!!! identity won't persist
|
||||||
session.setAuthData(new AuthData(extraData.displayName, extraData.identity, extraData.xuid));
|
session.setAuthData(new AuthData(extraData.displayName, extraData.identity, extraData.xuid));
|
||||||
session.setCertChainData(certChainData);
|
if (authPayload instanceof CertificateChainPayload certificateChainPayload) {
|
||||||
|
session.setCertChainData(certificateChainPayload.getChain());
|
||||||
|
} else {
|
||||||
|
GeyserImpl.getInstance().getLogger().warning("Received new auth payload!");
|
||||||
|
session.setCertChainData(List.of());
|
||||||
|
}
|
||||||
|
|
||||||
PublicKey identityPublicKey = result.identityClaims().parsedIdentityPublicKey();
|
PublicKey identityPublicKey = result.identityClaims().parsedIdentityPublicKey();
|
||||||
|
|
||||||
byte[] clientDataPayload = EncryptionUtils.verifyClientData(clientData, identityPublicKey);
|
byte[] clientDataPayload = EncryptionUtils.verifyClientData(jwt, identityPublicKey);
|
||||||
if (clientDataPayload == null) {
|
if (clientDataPayload == null) {
|
||||||
throw new IllegalStateException("Client data isn't signed by the given chain data");
|
throw new IllegalStateException("Client data isn't signed by the given chain data");
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonNode clientDataJson = JSON_MAPPER.readTree(clientDataPayload);
|
JsonNode clientDataJson = JSON_MAPPER.readTree(clientDataPayload);
|
||||||
BedrockClientData data = JSON_MAPPER.convertValue(clientDataJson, BedrockClientData.class);
|
BedrockClientData data = JSON_MAPPER.convertValue(clientDataJson, BedrockClientData.class);
|
||||||
data.setOriginalString(clientData);
|
data.setOriginalString(jwt);
|
||||||
session.setClientData(data);
|
session.setClientData(data);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
BIN
core/src/main/resources/bedrock/block_palette.1_21_90.nbt
Normal file
BIN
core/src/main/resources/bedrock/block_palette.1_21_90.nbt
Normal file
Binary file not shown.
9044
core/src/main/resources/bedrock/creative_items.1_21_90.json
Normal file
9044
core/src/main/resources/bedrock/creative_items.1_21_90.json
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
10904
core/src/main/resources/bedrock/runtime_item_states.1_21_90.json
Normal file
10904
core/src/main/resources/bedrock/runtime_item_states.1_21_90.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -50,9 +50,9 @@
|
|||||||
"spawns_warm_variant_frogs"
|
"spawns_warm_variant_frogs"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"snowy_slopes": {
|
"grove": {
|
||||||
"temperature": -0.3,
|
"temperature": -0.2,
|
||||||
"downfall": 0.9,
|
"downfall": 0.8,
|
||||||
"redSporeDensity": 0.0,
|
"redSporeDensity": 0.0,
|
||||||
"blueSporeDensity": 0.0,
|
"blueSporeDensity": 0.0,
|
||||||
"ashDensity": 0.0,
|
"ashDensity": 0.0,
|
||||||
@@ -70,17 +70,17 @@
|
|||||||
"id": null,
|
"id": null,
|
||||||
"tags": [
|
"tags": [
|
||||||
"mountains",
|
"mountains",
|
||||||
|
"cold",
|
||||||
"monster",
|
"monster",
|
||||||
"overworld",
|
"overworld",
|
||||||
"frozen",
|
"grove",
|
||||||
|
"spawns_cold_variant_farm_animals",
|
||||||
"spawns_cold_variant_frogs",
|
"spawns_cold_variant_frogs",
|
||||||
"spawns_snow_foxes",
|
"spawns_snow_foxes",
|
||||||
"spawns_white_rabbits",
|
"spawns_white_rabbits"
|
||||||
"snowy_slopes",
|
|
||||||
"spawns_cold_variant_farm_animals"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"jagged_peaks": {
|
"frozen_peaks": {
|
||||||
"temperature": -0.7,
|
"temperature": -0.7,
|
||||||
"downfall": 0.9,
|
"downfall": 0.9,
|
||||||
"redSporeDensity": 0.0,
|
"redSporeDensity": 0.0,
|
||||||
@@ -103,7 +103,7 @@
|
|||||||
"monster",
|
"monster",
|
||||||
"overworld",
|
"overworld",
|
||||||
"frozen",
|
"frozen",
|
||||||
"jagged_peaks",
|
"frozen_peaks",
|
||||||
"spawns_cold_variant_farm_animals",
|
"spawns_cold_variant_farm_animals",
|
||||||
"spawns_cold_variant_frogs",
|
"spawns_cold_variant_frogs",
|
||||||
"spawns_snow_foxes",
|
"spawns_snow_foxes",
|
||||||
@@ -338,6 +338,32 @@
|
|||||||
"has_structure_trail_ruins"
|
"has_structure_trail_ruins"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"meadow": {
|
||||||
|
"temperature": 0.3,
|
||||||
|
"downfall": 0.8,
|
||||||
|
"redSporeDensity": 0.0,
|
||||||
|
"blueSporeDensity": 0.0,
|
||||||
|
"ashDensity": 0.0,
|
||||||
|
"whiteAshDensity": 0.0,
|
||||||
|
"depth": 0.1,
|
||||||
|
"scale": 0.2,
|
||||||
|
"mapWaterColor": {
|
||||||
|
"a": 166,
|
||||||
|
"r": 96,
|
||||||
|
"g": 183,
|
||||||
|
"b": 255
|
||||||
|
},
|
||||||
|
"rain": true,
|
||||||
|
"chunkGenData": null,
|
||||||
|
"id": null,
|
||||||
|
"tags": [
|
||||||
|
"mountains",
|
||||||
|
"monster",
|
||||||
|
"overworld",
|
||||||
|
"meadow",
|
||||||
|
"bee_habitat"
|
||||||
|
]
|
||||||
|
},
|
||||||
"jungle_mutated": {
|
"jungle_mutated": {
|
||||||
"temperature": 0.95,
|
"temperature": 0.95,
|
||||||
"downfall": 0.9,
|
"downfall": 0.9,
|
||||||
@@ -365,6 +391,36 @@
|
|||||||
"spawns_warm_variant_farm_animals"
|
"spawns_warm_variant_farm_animals"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"jagged_peaks": {
|
||||||
|
"temperature": -0.7,
|
||||||
|
"downfall": 0.9,
|
||||||
|
"redSporeDensity": 0.0,
|
||||||
|
"blueSporeDensity": 0.0,
|
||||||
|
"ashDensity": 0.0,
|
||||||
|
"whiteAshDensity": 0.0,
|
||||||
|
"depth": 0.1,
|
||||||
|
"scale": 0.2,
|
||||||
|
"mapWaterColor": {
|
||||||
|
"a": 166,
|
||||||
|
"r": 96,
|
||||||
|
"g": 183,
|
||||||
|
"b": 255
|
||||||
|
},
|
||||||
|
"rain": true,
|
||||||
|
"chunkGenData": null,
|
||||||
|
"id": null,
|
||||||
|
"tags": [
|
||||||
|
"mountains",
|
||||||
|
"monster",
|
||||||
|
"overworld",
|
||||||
|
"frozen",
|
||||||
|
"jagged_peaks",
|
||||||
|
"spawns_cold_variant_farm_animals",
|
||||||
|
"spawns_cold_variant_frogs",
|
||||||
|
"spawns_snow_foxes",
|
||||||
|
"spawns_white_rabbits"
|
||||||
|
]
|
||||||
|
},
|
||||||
"flower_forest": {
|
"flower_forest": {
|
||||||
"temperature": 0.7,
|
"temperature": 0.7,
|
||||||
"downfall": 0.8,
|
"downfall": 0.8,
|
||||||
@@ -586,6 +642,32 @@
|
|||||||
"spawns_warm_variant_farm_animals"
|
"spawns_warm_variant_farm_animals"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"lush_caves": {
|
||||||
|
"temperature": 0.9,
|
||||||
|
"downfall": 0.0,
|
||||||
|
"redSporeDensity": 0.0,
|
||||||
|
"blueSporeDensity": 0.0,
|
||||||
|
"ashDensity": 0.0,
|
||||||
|
"whiteAshDensity": 0.0,
|
||||||
|
"depth": 0.1,
|
||||||
|
"scale": 0.2,
|
||||||
|
"mapWaterColor": {
|
||||||
|
"a": 166,
|
||||||
|
"r": 96,
|
||||||
|
"g": 183,
|
||||||
|
"b": 255
|
||||||
|
},
|
||||||
|
"rain": true,
|
||||||
|
"chunkGenData": null,
|
||||||
|
"id": null,
|
||||||
|
"tags": [
|
||||||
|
"caves",
|
||||||
|
"lush_caves",
|
||||||
|
"overworld",
|
||||||
|
"monster",
|
||||||
|
"spawns_tropical_fish_at_any_height"
|
||||||
|
]
|
||||||
|
},
|
||||||
"deep_frozen_ocean": {
|
"deep_frozen_ocean": {
|
||||||
"temperature": 0.0,
|
"temperature": 0.0,
|
||||||
"downfall": 0.5,
|
"downfall": 0.5,
|
||||||
@@ -834,33 +916,6 @@
|
|||||||
"spawns_cold_variant_farm_animals"
|
"spawns_cold_variant_farm_animals"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"crimson_forest": {
|
|
||||||
"temperature": 2.0,
|
|
||||||
"downfall": 0.0,
|
|
||||||
"redSporeDensity": 0.25,
|
|
||||||
"blueSporeDensity": 0.0,
|
|
||||||
"ashDensity": 0.0,
|
|
||||||
"whiteAshDensity": 0.0,
|
|
||||||
"depth": 0.1,
|
|
||||||
"scale": 0.2,
|
|
||||||
"mapWaterColor": {
|
|
||||||
"a": 165,
|
|
||||||
"r": 144,
|
|
||||||
"g": 89,
|
|
||||||
"b": 87
|
|
||||||
},
|
|
||||||
"rain": false,
|
|
||||||
"chunkGenData": null,
|
|
||||||
"id": null,
|
|
||||||
"tags": [
|
|
||||||
"nether",
|
|
||||||
"netherwart_forest",
|
|
||||||
"crimson_forest",
|
|
||||||
"spawn_few_zombified_piglins",
|
|
||||||
"spawn_piglin",
|
|
||||||
"spawns_warm_variant_farm_animals"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"mesa": {
|
"mesa": {
|
||||||
"temperature": 2.0,
|
"temperature": 2.0,
|
||||||
"downfall": 0.0,
|
"downfall": 0.0,
|
||||||
@@ -998,6 +1053,32 @@
|
|||||||
"spawns_cold_variant_farm_animals"
|
"spawns_cold_variant_farm_animals"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"warped_forest": {
|
||||||
|
"temperature": 2.0,
|
||||||
|
"downfall": 0.0,
|
||||||
|
"redSporeDensity": 0.0,
|
||||||
|
"blueSporeDensity": 0.25,
|
||||||
|
"ashDensity": 0.0,
|
||||||
|
"whiteAshDensity": 0.0,
|
||||||
|
"depth": 0.1,
|
||||||
|
"scale": 0.2,
|
||||||
|
"mapWaterColor": {
|
||||||
|
"a": 165,
|
||||||
|
"r": 144,
|
||||||
|
"g": 89,
|
||||||
|
"b": 87
|
||||||
|
},
|
||||||
|
"rain": false,
|
||||||
|
"chunkGenData": null,
|
||||||
|
"id": null,
|
||||||
|
"tags": [
|
||||||
|
"nether",
|
||||||
|
"netherwart_forest",
|
||||||
|
"warped_forest",
|
||||||
|
"spawn_endermen",
|
||||||
|
"spawns_warm_variant_farm_animals"
|
||||||
|
]
|
||||||
|
},
|
||||||
"mesa_plateau_stone": {
|
"mesa_plateau_stone": {
|
||||||
"temperature": 2.0,
|
"temperature": 2.0,
|
||||||
"downfall": 0.0,
|
"downfall": 0.0,
|
||||||
@@ -1385,32 +1466,6 @@
|
|||||||
"spawns_warm_variant_farm_animals"
|
"spawns_warm_variant_farm_animals"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"meadow": {
|
|
||||||
"temperature": 0.3,
|
|
||||||
"downfall": 0.8,
|
|
||||||
"redSporeDensity": 0.0,
|
|
||||||
"blueSporeDensity": 0.0,
|
|
||||||
"ashDensity": 0.0,
|
|
||||||
"whiteAshDensity": 0.0,
|
|
||||||
"depth": 0.1,
|
|
||||||
"scale": 0.2,
|
|
||||||
"mapWaterColor": {
|
|
||||||
"a": 166,
|
|
||||||
"r": 96,
|
|
||||||
"g": 183,
|
|
||||||
"b": 255
|
|
||||||
},
|
|
||||||
"rain": true,
|
|
||||||
"chunkGenData": null,
|
|
||||||
"id": null,
|
|
||||||
"tags": [
|
|
||||||
"mountains",
|
|
||||||
"monster",
|
|
||||||
"overworld",
|
|
||||||
"meadow",
|
|
||||||
"bee_habitat"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"jungle_hills": {
|
"jungle_hills": {
|
||||||
"temperature": 0.95,
|
"temperature": 0.95,
|
||||||
"downfall": 0.9,
|
"downfall": 0.9,
|
||||||
@@ -1467,36 +1522,6 @@
|
|||||||
"spawns_cold_variant_farm_animals"
|
"spawns_cold_variant_farm_animals"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"frozen_peaks": {
|
|
||||||
"temperature": -0.7,
|
|
||||||
"downfall": 0.9,
|
|
||||||
"redSporeDensity": 0.0,
|
|
||||||
"blueSporeDensity": 0.0,
|
|
||||||
"ashDensity": 0.0,
|
|
||||||
"whiteAshDensity": 0.0,
|
|
||||||
"depth": 0.1,
|
|
||||||
"scale": 0.2,
|
|
||||||
"mapWaterColor": {
|
|
||||||
"a": 166,
|
|
||||||
"r": 96,
|
|
||||||
"g": 183,
|
|
||||||
"b": 255
|
|
||||||
},
|
|
||||||
"rain": true,
|
|
||||||
"chunkGenData": null,
|
|
||||||
"id": null,
|
|
||||||
"tags": [
|
|
||||||
"mountains",
|
|
||||||
"monster",
|
|
||||||
"overworld",
|
|
||||||
"frozen",
|
|
||||||
"frozen_peaks",
|
|
||||||
"spawns_cold_variant_farm_animals",
|
|
||||||
"spawns_cold_variant_frogs",
|
|
||||||
"spawns_snow_foxes",
|
|
||||||
"spawns_white_rabbits"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"taiga": {
|
"taiga": {
|
||||||
"temperature": 0.25,
|
"temperature": 0.25,
|
||||||
"downfall": 0.8,
|
"downfall": 0.8,
|
||||||
@@ -1633,6 +1658,33 @@
|
|||||||
"warm"
|
"warm"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"crimson_forest": {
|
||||||
|
"temperature": 2.0,
|
||||||
|
"downfall": 0.0,
|
||||||
|
"redSporeDensity": 0.25,
|
||||||
|
"blueSporeDensity": 0.0,
|
||||||
|
"ashDensity": 0.0,
|
||||||
|
"whiteAshDensity": 0.0,
|
||||||
|
"depth": 0.1,
|
||||||
|
"scale": 0.2,
|
||||||
|
"mapWaterColor": {
|
||||||
|
"a": 165,
|
||||||
|
"r": 144,
|
||||||
|
"g": 89,
|
||||||
|
"b": 87
|
||||||
|
},
|
||||||
|
"rain": false,
|
||||||
|
"chunkGenData": null,
|
||||||
|
"id": null,
|
||||||
|
"tags": [
|
||||||
|
"nether",
|
||||||
|
"netherwart_forest",
|
||||||
|
"crimson_forest",
|
||||||
|
"spawn_few_zombified_piglins",
|
||||||
|
"spawn_piglin",
|
||||||
|
"spawns_warm_variant_farm_animals"
|
||||||
|
]
|
||||||
|
},
|
||||||
"ice_plains": {
|
"ice_plains": {
|
||||||
"temperature": 0.0,
|
"temperature": 0.0,
|
||||||
"downfall": 0.5,
|
"downfall": 0.5,
|
||||||
@@ -1958,32 +2010,6 @@
|
|||||||
"spawns_cold_variant_frogs"
|
"spawns_cold_variant_frogs"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"warped_forest": {
|
|
||||||
"temperature": 2.0,
|
|
||||||
"downfall": 0.0,
|
|
||||||
"redSporeDensity": 0.0,
|
|
||||||
"blueSporeDensity": 0.25,
|
|
||||||
"ashDensity": 0.0,
|
|
||||||
"whiteAshDensity": 0.0,
|
|
||||||
"depth": 0.1,
|
|
||||||
"scale": 0.2,
|
|
||||||
"mapWaterColor": {
|
|
||||||
"a": 165,
|
|
||||||
"r": 144,
|
|
||||||
"g": 89,
|
|
||||||
"b": 87
|
|
||||||
},
|
|
||||||
"rain": false,
|
|
||||||
"chunkGenData": null,
|
|
||||||
"id": null,
|
|
||||||
"tags": [
|
|
||||||
"nether",
|
|
||||||
"netherwart_forest",
|
|
||||||
"warped_forest",
|
|
||||||
"spawn_endermen",
|
|
||||||
"spawns_warm_variant_farm_animals"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"mesa_plateau_stone_mutated": {
|
"mesa_plateau_stone_mutated": {
|
||||||
"temperature": 2.0,
|
"temperature": 2.0,
|
||||||
"downfall": 0.0,
|
"downfall": 0.0,
|
||||||
@@ -2037,9 +2063,9 @@
|
|||||||
"spawns_without_patrols"
|
"spawns_without_patrols"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"grove": {
|
"snowy_slopes": {
|
||||||
"temperature": -0.2,
|
"temperature": -0.3,
|
||||||
"downfall": 0.8,
|
"downfall": 0.9,
|
||||||
"redSporeDensity": 0.0,
|
"redSporeDensity": 0.0,
|
||||||
"blueSporeDensity": 0.0,
|
"blueSporeDensity": 0.0,
|
||||||
"ashDensity": 0.0,
|
"ashDensity": 0.0,
|
||||||
@@ -2057,14 +2083,14 @@
|
|||||||
"id": null,
|
"id": null,
|
||||||
"tags": [
|
"tags": [
|
||||||
"mountains",
|
"mountains",
|
||||||
"cold",
|
|
||||||
"monster",
|
"monster",
|
||||||
"overworld",
|
"overworld",
|
||||||
"grove",
|
"frozen",
|
||||||
"spawns_cold_variant_farm_animals",
|
|
||||||
"spawns_cold_variant_frogs",
|
"spawns_cold_variant_frogs",
|
||||||
"spawns_snow_foxes",
|
"spawns_snow_foxes",
|
||||||
"spawns_white_rabbits"
|
"spawns_white_rabbits",
|
||||||
|
"snowy_slopes",
|
||||||
|
"spawns_cold_variant_farm_animals"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"warm_ocean": {
|
"warm_ocean": {
|
||||||
@@ -2312,32 +2338,6 @@
|
|||||||
"overworld"
|
"overworld"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"lush_caves": {
|
|
||||||
"temperature": 0.9,
|
|
||||||
"downfall": 0.0,
|
|
||||||
"redSporeDensity": 0.0,
|
|
||||||
"blueSporeDensity": 0.0,
|
|
||||||
"ashDensity": 0.0,
|
|
||||||
"whiteAshDensity": 0.0,
|
|
||||||
"depth": 0.1,
|
|
||||||
"scale": 0.2,
|
|
||||||
"mapWaterColor": {
|
|
||||||
"a": 166,
|
|
||||||
"r": 96,
|
|
||||||
"g": 183,
|
|
||||||
"b": 255
|
|
||||||
},
|
|
||||||
"rain": true,
|
|
||||||
"chunkGenData": null,
|
|
||||||
"id": null,
|
|
||||||
"tags": [
|
|
||||||
"caves",
|
|
||||||
"lush_caves",
|
|
||||||
"overworld",
|
|
||||||
"monster",
|
|
||||||
"spawns_tropical_fish_at_any_height"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"frozen_ocean": {
|
"frozen_ocean": {
|
||||||
"temperature": 0.0,
|
"temperature": 0.0,
|
||||||
"downfall": 0.5,
|
"downfall": 0.5,
|
||||||
|
|||||||
@@ -8,5 +8,5 @@ org.gradle.vfs.watch=false
|
|||||||
|
|
||||||
group=org.geysermc
|
group=org.geysermc
|
||||||
id=geyser
|
id=geyser
|
||||||
version=2.7.1-SNAPSHOT
|
version=2.7.2-SNAPSHOT
|
||||||
description=Allows for players from Minecraft: Bedrock Edition to join Minecraft: Java Edition servers.
|
description=Allows for players from Minecraft: Bedrock Edition to join Minecraft: Java Edition servers.
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ netty = "4.2.1.Final"
|
|||||||
guava = "29.0-jre"
|
guava = "29.0-jre"
|
||||||
gson = "2.3.1" # Provided by Spigot 1.8.8
|
gson = "2.3.1" # Provided by Spigot 1.8.8
|
||||||
websocket = "1.5.1"
|
websocket = "1.5.1"
|
||||||
protocol-connection = "3.0.0.Beta6-20250506.012145-17"
|
protocol-connection = "3.0.0.Beta7-20250616.124609-6"
|
||||||
protocol-common = "3.0.0.Beta6-20250506.012145-17"
|
protocol-common = "3.0.0.Beta7-20250616.124609-6"
|
||||||
protocol-codec = "3.0.0.Beta6-20250506.012145-17"
|
protocol-codec = "3.0.0.Beta7-20250616.124609-6"
|
||||||
raknet = "1.0.0.CR3-20250218.160705-18"
|
raknet = "1.0.0.CR3-20250218.160705-18"
|
||||||
minecraftauth = "4.1.1"
|
minecraftauth = "4.1.1"
|
||||||
mcprotocollib = "1.21.5-20250509.144049-29"
|
mcprotocollib = "1.21.5-20250509.144049-29"
|
||||||
|
|||||||
Reference in New Issue
Block a user